6

我想使用 python imap 和电子邮件包检索电子邮件的正文(仅文本)。

根据这个SO thread,我正在使用以下代码:

mail = email.message_from_string(email_body)
bodytext = mail.get_payload()[ 0 ].get_payload()

虽然它在某些情况下工作正常,但有时我得到类似于以下响应

[<email.message.Message instance at 0x0206DCD8>, <email.message.Message instance at 0x0206D508>]
4

4 回答 4

7

在我的案例中,主要问题是回复或转发的消息在正文中显示为消息实例。

使用以下代码解决了我的问题:

bodytext=mail.get_payload()[0].get_payload();
if type(bodytext) is list:
    bodytext=','.join(str(v) for v in bodytext)
于 2013-05-07T12:24:36.083 回答
7

您假设消息具有统一的结构,具有一个明确定义的“主要部分”。事实并非如此; 消息可能包含单个部分而不是文本部分(只是二进制文件的“附件”,仅此而已),也可能是包含多个文本部分的多部分(或者,同样,根本没有),甚至如果只有一个,则不必是第一部分。此外,还有嵌套的多部分(一个或多个部分是另一个 MIME 消息,递归地)。

总而言之,您必须检查 MIME 结构,然后决定哪些部分与您的应用程序相关。如果您只收到来自相当静态的一小部分客户端的消息,您可能能够偷工减料(至少在 Microsoft Plague 的下一次升级之前),但总的来说,根本没有任何类型的层次结构,只是一组(不一定总是直接相关的)同样重要的部分。

于 2013-05-08T04:09:11.803 回答
0

也许这篇(我的)帖子会有所帮助。我收到一份时事通讯,上面有美国不同种类石油的价格。我在 gmail 中获取具有给定标题模式的电子邮件,然后使用正则表达式提取邮件正文中的价格。所以我必须访问标题遵守给定模式的最后 n 封电子邮件的邮件正文。

email.message_from_string()也在使用:msg = email.message_from_string(response_part[1])

所以也许它会给你具体的例子来说明如何在这个 python 库中使用方法。

于 2013-05-07T05:37:13.920 回答
0

外部库:https ://github.com/ikvk/imap_tools

from imap_tools import MailBox 

# get list of email texts from INBOX folder
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:
    data = [msg.text for msg in mailbox.fetch()]
于 2021-02-01T04:29:02.540 回答