当前位置: 首页 > 面试题库 >

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

姚烨
2023-03-14
问题内容

我目前正在使用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版本来明确重组“引用的内容”。

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

尽管如此,还是应该回答我最初的问题,因为无论如何我现在已经弄清楚了如何解决。

首先,将原始邮件中的所有附件替换为文本/纯文本占位符:

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



 类似资料:
  • 我有Microsoft Exchange: 有办法做到这一点吗?要通读原始电子邮件信息,查看回复者是谁并转发到该电子邮件地址? 如果我们不能将其作为宏来完成,那么我们是否可以将发送到:mail@domain.com的所有邮件转发到脚本中,并让脚本处理解析呢?

  • 我能够通过IMAP连接到Gmail并进行解析,但是在电子邮件正文中,我获得了Gmail特定的内容,例如

  • 如果PhpMailer包含堆栈(例如。它总是返回“无效地址”错误。 有没有办法忽略这张支票?还是有充分的理由?我似乎在代码中找不到它,因此我没有在这里包含它。 非常感谢您的帮助。

  • 我试图发送原始电子邮件与图像作为附件存储在s3使用我试图发送原始电子邮件与图像作为附件存储在s3使用java。然而,当接收电子邮件时图像被损坏。我尝试使用存储在磁盘中的文件,它正常工作,但它不适用于存储在S3中的文件。这是我使用的代码。 请帮帮我,我被困在这里好长一段时间了。

  • 在本章中,我们将了解如何使用JavaMail API回复电子邮件。 以下程序中遵循的基本步骤是: 在属性中获取具有POP和SMPT服务器详细信息的Session对象。 我们需要POP详细信息来检索消息和SMPT详细信息以发送消息。 创建POP3商店对象并连接到商店。 创建文件夹对象并在邮箱中打开相应的文件夹。 检索邮件。 如果要回复,请仔细检查消息并输入“Y”或“y”。 获取邮件的所有信息(收件人

  • 我正在尝试使用Java使用IMAP阅读电子邮件和SMTP回复它们来编写Gmail自动回复程序。我使用imap阅读电子邮件,当回复发送电子邮件的人时,我使用SMTP。我希望我发送的电子邮件具有回复格式,与您在gmail中单击回复时获得的格式相同,其中包括日期和发件人最初发送的消息。Javamail中有没有一种方法可以做到这一点?如果没有,最好的方法是什么? 问候!