我想使用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>]
答案 0 :(得分:6)
我的主要问题是在bodytext中显示为消息实例的回复或转发消息。
使用以下代码解决了我的问题:
bodytext=mail.get_payload()[0].get_payload();
if type(bodytext) is list:
bodytext=','.join(str(v) for v in bodytext)
答案 1 :(得分:6)
您假设消息具有统一的结构,其中一个定义明确的“主要部分”。事实并非如此;可能有单个部分的消息不是文本部分(只是二进制文件的“附件”,没有其他内容)或者它可以是具有多个文本部分的多部分(或者,根本没有)甚至是如果只有一个,则不必是第一部分。此外,还有嵌套的多部分(一个或多个部分是另一个MIME消息,递归地)。
在很多话中,您必须检查MIME结构,然后确定哪些部分与您的应用程序相关。如果您只接收来自相当静态的一小组客户端的消息,您可能可以削减一些角落(至少在下一次升级Microsoft Plague命中之前),但一般来说,根本就没有任何类型的层次结构,只是一组(不一定总是直接相关)同等重要的部分。
答案 2 :(得分:0)
也许this post(我的)可以提供帮助。我收到一份时事通讯,其中包含美国不同种类的石油价格。我使用给定的标题模式在gmail中获取电子邮件,然后使用正则表达式提取邮件正文中的价格。所以我必须访问最后n封电子邮件的邮件正文,其标题是观察给定的模式。
我还在使用email.message_from_string()
:msg = email.message_from_string(response_part[1])
所以也许它给出了如何在这个python库中使用方法的具体示例。
答案 3 :(得分:0)
基本上你必须遍历消息的不同text / plain(或text / html)部分才能到达正文 - 绝对不能保证身体部位位于哪个位置! (虽然有一个惯例,它是第一个...在大多数情况下...可能......:)
由于我不想复制内容,请参阅my answer to quite similar question here,并根据您的需要进行调整。
答案 4 :(得分: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()]