Python IMAP:如何解析多部分邮件内容

7 投票
3 回答
13740 浏览
提问于 2025-04-16 06:33

一封邮件可以包含不同的部分,比如:

--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 个回答

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()

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"]
12

为了解析电子邮件,我使用了 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 模块及其迭代器。

撰写回答