使用Python的IMAP和邮件包获取电子邮件正文文本

6
我希望使用Python的imap和email包检索电子邮件正文(仅限文本)。
根据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个回答

7

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

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

bodytext=mail.get_payload()[0].get_payload();
if type(bodytext) is list:
    bodytext=','.join(str(v) for v in bodytext)

返回列表后合并内容的想法对我很有帮助,谢谢。 - scottydelta

7
您假设消息具有统一的结构,有一个明确定义的“主要部分”。然而实际情况并非如此;可能会有单个部分的消息不是文本部分(只是二进制文件的“附件”),或者可能是多个文本部分的多部分消息(或者根本没有),即使只有一个文本部分,它也不必是第一个部分。此外,还有嵌套的多部分消息(一个或多个部分是另一个MIME消息,递归地)。
简而言之,您必须检查MIME结构,然后决定哪些部分对您的应用程序是相关的。如果您仅从一个相当静态且较小的客户端集接收邮件,则您可以缩短某些角落(至少在下一次Microsoft Plague升级之前),但一般情况下,根本没有任何层次结构,只有一个(不一定总是直接相关的)同样重要的部分集合。

也许您还可以参考我的另一个回答什么是多部分电子邮件中的“部分”?,它与此类似但更为详细。 - tripleee
1
Python 3.6+有一个经过重新设计的email库,其中包含一个方法get_body,它尝试为您猜测“主体部分”。 - tripleee

1

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

from imap_tools import MailBox 

# get list of email bodies from INBOX folder
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:
    bodies = [msg.text or msg.html for msg in mailbox.fetch()]

0

也许我的这篇文章可以帮到你。我收到一份美国不同种类油价的通讯,使用正则表达式从邮件正文中提取价格,并通过给定标题模式在gmail中获取最近n封邮件的邮件正文。

我使用email.message_from_string()方法: msg = email.message_from_string(response_part[1])

因此,这可能为你提供了如何在Python库中使用方法的具体示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接