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

python imap:如何解析多部分邮件内容,python,email,imap,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-pr

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

--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获取每个块的内容?
以及如何获取每个块的属性?(内容类型等)

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


对于解析电子邮件,我使用了
Message.walk()
这样的方法:

if msg.is_multipart():
    for part in msg.walk():
        ...
对于内容,您可以尝试:
part.get\u payload()
。对于内容类型,有:
part.get\u content\u type()

您可以在此处找到文档:


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

我已经编写了这段代码。如果您喜欢,可以使用它来解析多部分内容:

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

谢谢!我还没有读到get_payload()返回消息列表!您能告诉我如何访问excel附件吗。当我尝试使用
part.get\u payload()
时,数据是字节格式的,我不知道如何将excel(.xlsx)文件保存到变量如果使用get\u payload(decode=True),库会自动解码
引用的可打印内容
base64
内容。从文档中可以看出:“可选解码是一个标志,根据内容传输编码标头指示是否应解码有效负载。如果为True且消息不是多部分,则如果该标头的值引用为printable或base64,则有效负载将被解码”-您如何知道上述代码中部分的深度?
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')