我在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']
来获得它
我怎样才能获得电子邮件文本的正文?
答案 0 :(得分:3)
您要求它提供名为TEXT
或BODY
的标题,显然没有这样的内容。我认为您正在混淆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
方法。)