如何使用imaplib获取电子邮件的正文?

时间:2014-08-11 02:13:18

标签: python-3.x imaplib

我在python3.4中。

import imaplib
import email
user="XXXX"
password="YYYY"
con=imaplib.IMAP4_SSL('imap.gmail.com')
con.login(user,password)
con.list()

con.select("INBOX")
result,data=con.fetch(b'1', '(RFC822)')
raw=email.message_from_bytes(data[0][1])

>>> raw["From"]
'xxxx'
>>> raw["To"]
'python-list@python.org'
>>> raw["Subject"]
'Re:get the min date from a list'

当我运行' print(raw)'电子邮件正文中有很多行,
我无法通过raw[TEXT]raw['TEXT']raw['BODY']来获得它 我怎样才能获得电子邮件文本的正文?

1 个答案:

答案 0 :(得分:3)

您要求它提供名为TEXTBODY的标题,显然没有这样的内容。我认为您正在混淆IMAP4部件名称(您在con.fetch中传递的内容)和RFC2822标题名称(您在email.message.Message中使用的内容)。

正如email.message文档所述,Message由标头和有效负载组成。有效载荷是字符串(对于非多部分消息)或子列表Message(对于多部分)。不管怎样,你想要的是raw.get_payload()

如果要同时处理这两者,可以先检查raw.is_multipart(),也可以检查get_payload()返回的类型。当然,在多部分消息的情况下,您必须确定要执行的操作;什么算作"身体"什么时候有三个部分?你想要第一个吗?第一个text/plain?第一个text/*?第一个text/plain(如果有的话),第一个text/*,如果没有,那么第一个即使不存在也是如此?或者他们所有人都在一起?

假设您只想要第一个。要做到这一点:

def get_text(msg):
    if msg.is_multipart():
        return get_text(msg.get_payload(0))
    else:
        return msg.get_payload(None, True)

如果你想要不同的东西,希望你能弄清楚如何自己做。 (请参阅get_content_type上的get_content_maintype和/或Message方法。)