在 Python 中如何将 `email.message.Message` 对象转换为 `email.message.EmailMessage` 对象

Posted

技术标签:

【中文标题】在 Python 中如何将 `email.message.Message` 对象转换为 `email.message.EmailMessage` 对象【英文标题】:In Python how to convert an `email.message.Message` object into an `email.message.EmailMessage` object 【发布时间】:2019-12-18 17:33:36 【问题描述】:

据我了解,Python 3.6 标准库中的mbox 类会生成email.message.Message 类型的旧式消息对象。

在 3.4/3.6 中引入的新类 email.message.EmailMessage 可以更轻松地访问消息内容(通过 get_content()get_body())。如何将我从 mbox 迭代器获得的 email.message.Message 对象转换为 email.message.EmailMessage 对象?

【问题讨论】:

我正要问同样的问题,但同时找到了解决方案。 :) 可以将旧式消息转换为字符串或字节,然后使用email.parser 模块再次解析它(策略必须设置为email.policy.default)。但更直接的方法是将工厂传递给mbox 类。像这样:mailbox.mbox(path, factory=lambda f: email.message_from_binary_file(f, policy=email.policy.default)) @ManuelJacob 太酷了!确实使用工厂是最好的!完美运行。值得成为一个答案,我认为...... 【参考方案1】:

使用@ManuelJaco's comment,我能够创建一个mbox 实例,其中自动包含email.message.EmailMessage 类型的消息对象:

def make_EmailMessage(f):
    """Factory to create EmailMessage objects instead of Message objects"""
    return email.message_from_binary_file(f, policy=epolicy.default)

mbox = mailbox.mbox(mboxfile, factory=make_EmailMessage)

当迭代mbox 时,所有消息(甚至消息中包含的消息!)都是email.message.EmailMessage 类型。

【讨论】:

看起来你在做某种import email.policy as epolicy?原来的评论只是直接用了email.policy.default【参考方案2】:

要创建email.message.EmailMessage 对象,请将解析器中的策略更改为email.policy.default

msg = email.message_from_string(raw_email_string,
                            policy = email.policy.default)

【讨论】:

以上是关于在 Python 中如何将 `email.message.Message` 对象转换为 `email.message.EmailMessage` 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SSML 合并到 Python 中

如何将我的打印语句保存在列表中? Python [关闭]

如何在python中解压12个字节? php代码可用!试图将其转换为 python

如何在 Python 中执行将数据写入标准输入的进程?

如何将python的路径加到path中

如何在linux系统中,将python3.4更新到python3.5