用Python传输电子邮件



我试过用Python重新发送电子邮件,但没有结论。

一旦我登录SMTP和IMAP与TLS,这是我写的:

status, data = self._imapserver.fetch(id, "(RFC822)")
email_data = data[0][1]
# create a Message instance from the email data
message = email.message_from_string(email_data)
# replace headers (could do other processing here)
message.replace_header("From", 'blablabla@bliblibli.com')
message.replace_header("To", 'blobloblo@blublublu.com')
self._smtpserver.sendmail('blablabla@bliblibli.com', 'blobloblo@blublublu.com', message.as_string())

但问题是变量数据不能从电子邮件中捕获信息,即使ID是我需要的。它告诉我:

b'The specified message set is invalid.'

如何用Python传输电子邮件?

就像错误消息所说的那样,您在id中的任何内容都是无效的。我们不知道你在那里放了什么,所以我们只能告诉你错误信息中已经有了什么。

(另外,可能不要使用id作为变量名,因为您将遮蔽同名的内置函数。)

在你的代码中有更多的bug;你需要使用message_from_bytes,如果你想解析它,虽然真的没有必要替换头只是重新发送它。

status, data = self._imapserver.fetch(correct_id, "(RFC822)")
self._smtpserver.sendmail('blablabla@bliblibli.com', 'blobloblo@blublublu.com', data[0][1])

如果你想解析消息,也许你应该添加一个policy参数;这将选择Python 3.6中引入的现代EmailMessageAPI。

from email.policy import default
...
message = email.message_from_bytes(data[0][1], policy=default)
message["From"] = "blablabla@bliblibli.com"
message["To"] = "blobloblo@blublublu.com"
self._smtpserver.send_message(message)

send_message方法是新API的新增功能。如果消息可以包含其他的收件人头,如Cc:,Bcc:等,也许使用好的旧sendmail方法会更好,因为它完全忽略消息的头。

最新更新