我试过用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中引入的现代EmailMessage
API。
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
方法会更好,因为它完全忽略消息的头。