Python:如何在注意图形结构的同时迭代 MIME 消息树?

Posted

技术标签:

【中文标题】Python:如何在注意图形结构的同时迭代 MIME 消息树?【英文标题】:Python: How to iterate over MIME message tree while taking notice of the graph structure? 【发布时间】:2021-12-12 18:16:27 【问题描述】:

我想知道如何在 Python 中获取 MIME 消息图结构(例如,作为邻接矩阵)。

根据官方 Python3 文档,有一个 email.walk() 方法可以遍历所有消息部分:

for part in email.walk():
   print(part.get_content_type())

但是输出没有显示消息的层次结构。例如以下输出:

multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain

它可以表示以下两种树结构中的任何一种:

multipart/report
    text/plain
    message/rfc822
        text/plain
        text/plain
    message/rfc822
        text/plain

multipart/report
    text/plain
    message/rfc822
        text/plain
        text/plain
        message/rfc822
            text/plain

如果是 MIME 消息,python 中是否有任何方法可以帮助确定确切的分层(图形)结构?

【问题讨论】:

请提供足够的代码,以便其他人更好地理解问题。您尝试过什么,或者您正在考虑尝试什么? 【参考方案1】:

假设您已将电子邮件读入变量email

然后,如果您执行print(email.get_content_type()),它应该显示类似multipart/report 的内容(以您提供的示例为例)。

那你可以试试

if email.is_multipart():
    for subpart in email.get_payload():
        print(email.get_content_type())

然后打印出来

text/plain
message/rfc822

如果您考虑您提供的第二个树结构作为示例。

您可以对电子邮件的任何部分执行上述操作;如果它是多部分的,那么它将基本上分解成它的组件。

您可以使用它来创建一个递归函数,该函数可能会在打印部件的内容类型之前打印一个选项卡,具体取决于它的嵌套深度。

自从我上次使用电子邮件以来已经有一段时间了,但这应该可以解决问题。

【讨论】:

以上是关于Python:如何在注意图形结构的同时迭代 MIME 消息树?的主要内容,如果未能解决你的问题,请参考以下文章

哪些类似 python deque 的容器在突变期间保留有效的迭代器?

python 迭代器 一个奇怪的解决方法

递归:如何避免 Python set changed set 在迭代 RuntimeError 期间

使用 python-matplotlib 进行连续 3D 绘图(即图形更新)?

如何在循环的每次迭代中将新图形保存为 png

python_如何在一个for循环中迭代多个可迭代对象?