python imap:如何解析多部分邮件内容

时间:2010-11-04 08:34:20

标签: python email imap

邮件可以包含不同的块,例如:

--0016e68deb06b58acf04897c624e
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
content_1
...

--0016e68deb06b58acf04897c624e
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
content_2
... and so on

如何使用python获取每个块的内容?
还有如何获得每个块的属性? (内容类型等)。

3 个答案:

答案 0 :(得分:9)

对于解析电子邮件,我使用了Message.walk()方法,如下所示:

if msg.is_multipart():
    for part in msg.walk():
        ...

对于内容,您可以尝试:part.get_payload()。对于内容类型,有:part.get_content_type()

您可以在此处找到文档:http://docs.python.org/library/email.message.html

您也可以尝试email模块及其迭代器。

答案 1 :(得分:2)

http://docs.python.org/library/email.html

一个非常简单的例子(msg_as_str包含你从imap服务器获得的原始字节):

import email
msg = email.message_from_string(msg_as_str)
print msg["Subject"]

答案 2 :(得分:1)

我已经编写了这段代码。您可以根据需要使用它来解析多部分内容:

if mime_msg.is_multipart():
        for part in mime_msg.walk():
            if part.is_multipart():
                for subpart in part.get_payload():
                    if subpart.is_multipart():
                        for subsubpart in subpart.get_payload():
                            body = body + str(subsubpart.get_payload(decode=True)) + '\n'
                    else:
                        body = body + str(subpart.get_payload(decode=True)) + '\n'
            else:
                body = body + str(part.get_payload(decode=True)) + '\n'
else:
    body = body + str(mime_msg.get_payload(decode=True)) + '\n'

body = bytes(body,'utf-8').decode('unicode-escape')

如果您想使用纯文本格式,请将正文转换为html2text.HTML2Text()