我是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)

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

有见识吗?

编辑:好的,我只是尝试使用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中手动创建了 key ,所以我不知道,Windows添加了一个看不见的换行符,甚至vim或nano也看不到。用MCEdit删除它后,程序运行顺利。
谢谢您的帮助 :)

最佳答案

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

尝试传递text.as_string()代替

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

10-07 23:41