邮箱邮件中的电子邮件的非递归遍历



我正在尝试在Python 3.7中使用电子邮件,并正在努力解决兼容性问题。 文档提到email.message.Message有一个iter_parts方法,应该允许我执行消息部分的非递归遍历。

这在从mailbox消息返回的消息中不存在,我花了一段时间才让它运行。 例如,我可以生成一个虚拟消息:

from email.message import EmailMessage
msg = EmailMessage()
msg['Subject'] = 'msg 1'
msg.add_alternative("Plain text body", subtype='plain')
msg.add_alternative("<html><body><p>HTML body</p></body></html>", subtype='html')
msg.add_attachment(b"Nothing to see here!", maintype='data', subtype='raw')

然后用以下方法倾倒零件:

def iter_parts(msg):
ret = msg.get_content_type()
if msg.is_multipart():
parts = ', '.join(iter_parts(m) for m in msg.iter_parts())
ret = f'{ret} [{parts}]'
return ret
iter_parts(msg)

这给了我:multipart/mixed [multipart/alternative [text/plain, text/plain], data/raw]

但是如果我将其保存到mbox文件并重新加载它:

import mailbox
mbox = mailbox.mbox('/tmp/test.eml')
mbox.add(msg)
iter_parts(mbox[0])

它告诉我AttributeError: 'mboxMessage' object has no attribute 'iter_parts'

最初我认为这可能与 https://stackoverflow.com/a/45804980/1358308 有关,但设置factory=None在Python 3.7中似乎没有多大作用。

正在发布我的解决方案,但想知道是否有更好的选择!

经过多次查找和阅读源代码后,我发现我可以改为:

from email import policy
from email.parser import BytesParser
mbox = mailbox.mbox('/tmp/test.eml', factory=BytesParser(policy=policy.default).parse)

然后我用iter_parts方法获取对象。

最新更新