Python - 获取多部分电子邮件的正文

fuu*_*man 2 python email multipart

我收到一封包含以下代码的电子邮件:

m = imaplib.IMAP4_SSL(MailReceiveSRV)
m.login(MailReceiveUSER, MailReceivePWD)
m.select("Inbox")
status, unreadcount = m.status('INBOX', "(UNSEEN)")
unreadcount = int(unreadcount[0].split()[2].strip(').,]'))
items = m.search(None, "UNSEEN")
items = str(items[1]).strip('[\']').split(' ')
for index, emailid in enumerate(items):
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)
    for part in mail.walk():
        body = part.get_payload()
Run Code Online (Sandbox Code Playgroud)

仅供参考:这始终是示例代码的一部分。

但身体现在是一个很大的对象列表。如果 Content_Type 是纯文本,那就容易多了。

我现在如何才能访问该邮件的正文?

Ezr*_*zra 5

简短回答

您有一封由多部分组成的电子邮件。这就是为什么你得到一个列表而不是一个字符串:get_payload返回一个列表,Message说明它是否是多部分消息,string如果不是。

解释

来自文档

Message返回当前有效负载,当is_multipart()is 时,它将是一个对象列表,当isTrue时,它将是一个字符串。is_multipart()False

因此get_payload返回一个列表。

您获取主体的代码将类似于:

if email_message.is_multipart():
    for part in email_message.get_payload():
        body = part.get_payload()
        # more processing?
else:
    body = email_message.get_payload()
Run Code Online (Sandbox Code Playgroud)

再次,来自文档

请注意,is_multipart()返回True并不一定意味着“msg.get_content_maintype() == 'multipart'”将返回True. 例如,当类型为message/rfc822is_multipart时将返回。TrueMessage