在 python 中解析多部分电子邮件并保存附件

Posted

技术标签:

【中文标题】在 python 中解析多部分电子邮件并保存附件【英文标题】:Parsing Multipart emails in python and saving attachments 【发布时间】:2011-09-09 10:58:58 【问题描述】:

我对 python 很陌生,我正在尝试通过 python 的 imaplib 和电子邮件解析来自 gmail 的电子邮件。它工作得很好,但我遇到了电子邮件附件的问题。

我想从电子邮件中解析出所有纯文本,同时忽略可能作为辅助内容类型插入的任何 html,同时删除和保存所有其他附件。我一直在尝试以下方法:

...imaplib connection and mailbox selection...

typ, msg_data = c.fetch(num, '(RFC822)')
        email_body = msg_data[0][1]
mail = email.message_from_string(email_body)
        for part in mail.walk():
            if part.get_content_type() == 'text/plain':
                body = body + '\n' + part.get_payload()
            else:
                continue

这是我最初尝试只获取电子邮件的明文部分,但是当有人发送带有文本附件的电子邮件时,文本文件的内容会显示在上面的“正文”变量中。

谁能告诉我如何提取电子邮件的纯文本部分,同时忽略有时存在的辅助 HTML,同时将所有其他类型的文件附件保存为文件?如果这没有多大意义,我深表歉意。如果需要,我会更新问题并提供更多说明。

【问题讨论】:

对不起,我对 python 中可用的选项了解不多,但是否可以检查内容处置而不是内容类型。我想这会告诉你内容是内联还是附件?我很想看到对这个问题的任何回应。我们经常被问到解析电子邮件的最佳方法是使用cloudmailin.com。尽管我们经常传递纯文本,但用户会希望使用完整的电子邮件。 【参考方案1】:

如果您只需要将文本附件保留在 body 变量之外,那么就应该像这样简单:

mail = email.message_from_string(email_body)
    for part in mail.walk():
        c_type = part.get_content_type()
        c_disp = part.get('Content-Disposition')

        if c_type == 'text/plain' and c_disp == None:
            body = body + '\n' + part.get_payload()
        else:
            continue

那么如果 Content-Disposition 表明它是一个附件,您应该可以使用part.get_filename()part.get_payload() 来处理该文件。我不知道这是否会有所不同,但它基本上是我过去用来与我的邮件服务器交互的。

【讨论】:

以上是关于在 python 中解析多部分电子邮件并保存附件的主要内容,如果未能解决你的问题,请参考以下文章

Python:多部分 html 电子邮件通过嵌入式图像和附件发送

Python - 从电子邮件附件下载 excel 文件然后解析它

从多部分/替代消息中获取附件作为字符串[重复]

使用Python从邮件中下载附件和提取元数据

在 Python 中发送带有多个附件的电子邮件

如何从电子邮件中获取 csv 附件并保存