如何回复到使用Python imaplib一封电子邮件,包括原始邮件?
题
我目前使用 imaplib
以从服务器获取的电子邮件消息,并处理内容和附件。
我想如果它们可以被处理以状态/错误消息和链接回复消息到所得到的生成的内容在我的网站。这应包括原始消息,但应该删除任何附件(这将是大的),并且优选只用它们的文件名/尺寸替换它们。
由于我已经走在MIME消息部分,我假设我需要做的是建立一个包含原始邮件的副本,新的MIME消息树和删除/替换的连接节点。
在我开始沿着这条道路,我希望有人可以给我一些提示。是否有任何形式的库函数来做到这一点?任何一种标准行为,我应该坚持?
我目前知道的/我使用的imaplib
,smtplib
和email
模块,但可能已经错过了在那里的东西明显。这是在Django运行过,所以可以在django.core.email
使用任何东西,如果这使得它更容易。
解决方案
传入消息的原始MIME树结构如下(使用email.iterators._structure(msg)
):
multipart/mixed
text/html (message)
application/octet-stream (attachment 1)
application/octet-stream (attachment 2)
通过Gmail导致以下结构回复:
multipart/alternative
text/plain
text/html
即。他们是不是聪明,因为我以为,只是丢弃附件(良好),并提供文本和HTML版本的明确重组的“引用内容。”
我开始觉得这就是我应该做太多,只是一条简单的消息给予答复丢弃附件后有没有在保持原来的消息多点。
不过,不妨回答我原来的问题,因为我已经找到了如何反正现在。
首先,纯文本/占位符的原始消息中更换所有附件:
import email
original = email.message_from_string( ... )
for part in original.walk():
if (part.get('Content-Disposition')
and part.get('Content-Disposition').startswith("attachment")):
part.set_type("text/plain")
part.set_payload("Attachment removed: %s (%s, %d bytes)"
%(part.get_filename(),
part.get_content_type(),
len(part.get_payload(decode=True))))
del part["Content-Disposition"]
del part["Content-Transfer-Encoding"]
然后,创建的应答消息:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.message import MIMEMessage
new = MIMEMultipart("mixed")
body = MIMEMultipart("alternative")
body.attach( MIMEText("reply body text", "plain") )
body.attach( MIMEText("<html>reply body text</html>", "html") )
new.attach(body)
new["Message-ID"] = email.utils.make_msgid()
new["In-Reply-To"] = original["Message-ID"]
new["References"] = original["Message-ID"]
new["Subject"] = "Re: "+original["Subject"]
new["To"] = original["Reply-To"] or original["From"]
new["From"] = "me@mysite.com"
然后附原始MIME消息对象和发送:
new.attach( MIMEMessage(original) )
s = smtplib.SMTP()
s.sendmail("me@mysite.com", [new["To"]], new.as_string())
s.quit()
所得到的结构是:
multipart/mixed
multipart/alternative
text/plain
text/html
message/rfc822
multipart/mixed
text/html
text/plain
text/plain
或者它是一个有点简单的使用Django:
from django.core.mail import EmailMultiAlternatives
from email.mime.message import MIMEMessage
new = EmailMultiAlternatives("Re: "+original["Subject"],
"reply body text",
"me@mysite.com", # from
[original["Reply-To"] or original["From"]], # to
headers = {'Reply-To': "me@mysite.com",
"In-Reply-To": original["Message-ID"],
"References": original["Message-ID"]})
new.attach_alternative("<html>reply body text</html>", "text/html")
new.attach( MIMEMessage(original) ) # attach original message
new.send()
结果结束(GMail中至少),显示原始邮件作为“----转发消息----”这并不完全符合我后,但总的思想工作,我希望这个答案可以帮助有人试图弄清楚如何处理MIME消息的拨弄。
不隶属于 StackOverflow