使用Python中的DKIM手动签署电子邮件

时间:2014-04-03 09:43:21

标签: python email dkim

我是Python的新手并试图通过套接字通信创建一个发送脚本的电子邮件,但似乎无法用dkimpy lib签名。我在网上尝试了几个例子但是在运行dkim.sign时都返回了相同的错误:

File "C:\Python34\lib\re.py", line 196, in split return _compile(pattern,flags).split(string, maxsplit)
TypeError: expected string or buffer

我可以说,dkim.sign函数中的第一个变量应该是一个字符串,所以我尝试使用readlines()甚至.as_string()来确定。我检查了消息,它似乎符合RFC822。但我会仔细检查是否有人认为这可能是问题所在。如果没有dkim.sign,它可以完美运行(减去任何安全性,如SPF / DKIM)

这是我正在使用的代码的片段:

f=open('mail.htm','r') 
text=MIMEText(f.read(),'html') 
headers = Parser().parse(open('mail.htm', 'r')) 
sender=headers['From'] 
receiver=headers['To'] 
subj=headers['Subject'] 
f.close() 
private_key = open('default.pem').read() 
headers = ['To', 'From', 'Subject'] 
sig = dkim.sign(text, 'default', '<mydomain.here>', private_key, include_headers=headers)

解析的标头也用作套接字发送脚本的输入。我确实有一个用于测试目的的dkim键,但我认为它甚至没有达到这一点。

有什么见解?

编辑:好的,我刚尝试使用dkimpy lib中的dkim.rfc822_parse解析字符串(而不是签名),我收到以下错误:

return _compile(pattern, flags).split(string, maxsplit)
TypeError: can't use a bytes pattern on a string-like object

我是在阅读这篇文章,还是看起来代码期待字符串,但模式是以字节为单位?

FIXED:奇怪的是,我没想过检查private_key。我手动创建Win中的密钥,所以我不知道,Windows添加了一个隐形的换行符,甚至vim或nano都看不到。用MCEdit删除后,程序顺利运行。 谢谢你的帮助:)

2 个答案:

答案 0 :(得分:4)

如果我没记错的话,dkim.sign希望将完整的消息源作为参数,但是你传递了一个MIMEText对象。

尝试传递text.as_string()而不是

sig = dkim.sign(text.as_string(), .... )

答案 1 :(得分:0)

python3在处理字节和字符串之间存在很大的差异。

在使用dkim模块时,我发现避免转换的最简单方法是保持字节数,这就是我的用法:

from email.parser import BytesParser
import dkim

mail = BytesParser().parse (open('mail.eml', 'rb'))

print(dkim.verify( mail.as_bytes () ) )))

"rb"用于以字节模式打开文件。

尝试一下。