5

我是 Python 新手,并试图通过套接字通信创建一个电子邮件发送脚本,但似乎无法使用 dkimpy 库对其进行签名。我在网上尝试了几个示例,但在运行 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

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

修正:奇怪的是,我没想到要检查 private_key。我在 Win 中手动创建了我不知道的密钥,Windows 添加了一个不可见的换行符,即使 vim 或 nano 也看不到。使用 MCEdit 将其删除后,该程序可以顺利运行。谢谢您的帮助 :)

4

2 回答 2

4

如果我没记错的话, dkim.sign 期望完整的消息源作为参数,但是您传递的是 MIMEText 对象。

尝试通过 text.as_string() 代替

sig = dkim.sign(text.as_string(), .... )
于 2014-04-03T09:49:50.717 回答
0

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

我发现在使用模块时避免转换的最简单方法dkim是以字节为单位,这是我使用的:

from email.parser import BytesParser
import dkim

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

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

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

试试看。

于 2019-02-23T10:00:51.200 回答