2013-05-07 103 views
2

我想使用python imap和电子邮件包检索电子邮件正文(仅文本)。使用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>] 

回答

5

你假设的消息有一个统一的结构,具有一个明确定义的“主要部分”。事实并非如此;可以有一部分不是文本部分的消息(只是二进制文件的“附件”,除此之外没有其他内容),或者它可以是包含多个文本部分的多部分(或者再一次没有),甚至可以是如果只有一个,则不必是第一部分。此外,嵌套的多部分(一个或多个部分是另一个MIME消息,递归)。

用这么多的话来说,您必须检查MIME结构,然后决定哪个部分与您的应用程序相关。如果你只接收来自相当静态的小型客户端的消息,那么你可能会削减一些角落(至少在下一次微软鼠疫升级之前),但总的来说,没有任何类型的层次结构,只是一些(不一定总是直接相关的)同样重要的部分。

0

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

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

所以也许它给你如何在这条巨蟒的lib使用方法具体的例子。

6

在我的情况下,主要问题是在bodytext中作为消息实例显示的回复或转发的消息。

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

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

如果列表返回,加入内容的想法帮助了我,谢谢。 – scottydelta 2013-12-19 16:26:26

0

基本上你必须迭代消息的不同文本/纯文本(或文本/ html)部分才能到达正文 - 绝对不能保证哪个位置是正文部分! (虽然有约定它是第一个...在大多数情况下...大概... :)

因为我不想重复的内容,请参阅my answer to quite similar question here,并根据调整满足您的需求。