gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:56:29 26 4
gpt4 key购买 nike

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

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

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

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

我目前知道/正在使用 imaplibsmtplibemail 模块,但可能遗漏了一些明显的内容。这也在 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 版本。

我开始认为这也是我应该做的,只是用一条简单的消息回复,因为在丢弃附件后保留原始消息没有多大意义。

尽管如此,还是回答我最初的问题吧,因为我现在已经想出了办法。

首先,将原邮件中的所有附件替换为text/plain占位符:

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 消息。

关于python - 如何使用 Python imaplib 回复电子邮件并包含原始消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2182196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com