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