如何使用Python imaplib回复电子邮件并包含原始消息?

如何使用Python imaplib回复电子邮件并包含原始消息?,python,django,email,mime,imaplib,Python,Django,Email,Mime,Imaplib,我目前正在使用从服务器获取电子邮件并处理内容和附件 我想回复带有状态/错误消息的消息,并链接到我网站上生成的内容(如果可以处理)。这应包括原始邮件,但应删除任何附件(较大),最好只替换为其文件名/大小 由于我已经在浏览MIME消息部分,我假设我需要做的是构建一个新的MIME消息树,其中包含原始消息的副本,并删除/替换附件节点 在我开始这条路之前,我希望有人能给我一些建议。有什么样的库函数可以做到这一点吗?我应该坚持什么样的标准行为 我目前知道/am正在使用imaplib、smtplib和emai

我目前正在使用从服务器获取电子邮件并处理内容和附件

我想回复带有状态/错误消息的消息,并链接到我网站上生成的内容(如果可以处理)。这应包括原始邮件,但应删除任何附件(较大),最好只替换为其文件名/大小

由于我已经在浏览MIME消息部分,我假设我需要做的是构建一个新的MIME消息树,其中包含原始消息的副本,并删除/替换附件节点

在我开始这条路之前,我希望有人能给我一些建议。有什么样的库函数可以做到这一点吗?我应该坚持什么样的标准行为


我目前知道/am正在使用
imaplib
smtplib
email
模块,但可能遗漏了一些明显的内容。这也在Django中运行,因此可以使用
Django.core.email
中的任何内容,如果这样做更方便的话。

传入消息的原始MIME树结构如下(使用
email.iterators.\u structure(msg)
):

通过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"
由此产生的结构是:

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()
从django.core.mail导入电子邮件
从email.mime.message导入MIMEMessage
新建=EmailMultiAlternations(“Re:”+原始[“主题”],
“回复正文”,
"me@mysite.com“,#来自
[原件[“回复”]或原件[“从”],#至
标题={'Reply-To':“me@mysite.com",
“回复”:原件[“消息ID”],
“引用”:原始[“消息ID”]})
新增。附加可选内容(“回复正文”、“文本/html”)
新增。附加(MIMEMessage(原件))#附加原件
new.send()

结果(至少在GMail中)显示原始消息为“----转发消息----”,这不是我想要的,但总体思路是可行的,我希望这个答案能帮助尝试处理MIME消息的人。

“我希望这个答案能帮助尝试处理MIME消息的人。”----确实是这样。谢谢你,汤姆!你好我已完成了您编写的所有操作,出现了错误SMTPDataError:(552,b'5.7.0此邮件被阻止,因为其内容存在潜在的\n5.7.0安全问题。请访问\n5.7.0查看我们的\n5.7.0邮件内容和附件内容指导原则。n5sm277571lfd.52-gsmtp')
multipart/mixed
    multipart/alternative
        text/plain
        text/html
    message/rfc822
        multipart/mixed
            text/html
            text/plain
            text/plain
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()