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

7

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

--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获取每个块的内容?
还有,如何获取每个块的属性?(例如content-type等)

3个回答

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 模块及其迭代器。


谢谢!我还没有读到get_payload()返回消息列表的内容! - Sergey
请问您能否建议我如何访问Excel附件。当我尝试使用part.get_payload()时,数据以字节格式呈现,而我不知道如何将Excel(.xlsx)文件保存到变量中。 - Durga Gaddam
如果您使用get_payload(decode = True),该库将自动解码“quoted-printable”和“base64”内容。从文档中可以看到:“可选的解码是一个标志,指示是否应根据Content-Transfer-Encoding标头解码有效负载。当为True且消息不是多部分时,如果此标头的值为quoted-printable或base64,则将解码有效负载。”- https://docs.python.org/3.4/library/email.message.html - Tobias Ernst

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

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


https://stackoverflow.com/users/10538706/user10538706 你怎么知道上面代码中的部分深度? - user956424

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接