email.parser:解析电子邮件

源代码: Lib/email/parser.py


可以使用以下两种方法之一创建消息对象结构:可以pass创建EmailMessage对象,使用字典接口添加 Headers 以及使用set_content()和相关方法添加有效负载来从整个布料创建消息对象结构,也可以pass以下方式创建它们:解析电子邮件的序列化表示形式。

email软件包提供了一个标准解析器,该解析器可以理解大多数电子邮件文档结构,包括 MIME 文档。您可以向解析器传递字节,字符串或文件对象,解析器将返回给您对象结构的根EmailMessage实例。对于简单的非 MIME 消息,此根对象的有效负载可能是包含消息文本的字符串。对于 MIME 消息,根对象将从其is_multipart()方法返回True,并且可以pass有效负载操纵方法(例如get_body()iter_parts()walk())来访问子部分。

实际上有两个解析器接口可供使用,即Parser API 和增量FeedParser API。如果您将消息的整个文本存储在内存中,或者如果整个消息都位于文件系统上的文件中,则Parser API 最为有用。当您从流中读取消息(可能会阻止 await 更多 Importing)(例如从套接字读取电子邮件)时,FeedParser更合适。 FeedParser可以递增地使用和解析消息,并且仅在关闭解析器时返回根对象。

请注意,可以以有限的方式扩展解析器,当然,您可以完全从头开始实现自己的解析器。连接email包的 Binding 解析器和EmailMessage类的所有逻辑都包含在policy类中,因此自定义解析器可以pass实现适当的policy方法的自定义版本来以其认为必要的任何方式创建消息对象树。

FeedParser API

email.feedparser模块导入的BytesFeedParser提供了一个有助于增量解析电子邮件的 API,例如从可能阻塞的源(例如套接字)读取电子邮件的文本时,这是必需的。 BytesFeedParser当然可以用来解析完全包含在bytes-like object,字符串或文件中的电子邮件,但是BytesParser API 对于此类用例可能更方便。这两个解析器 API 的语义和结果相同。

BytesFeedParser的 API 很简单;您创建了一个实例,将其提供一堆字节,直到不再需要它,然后关闭解析器以检索根消息对象。 BytesFeedParser在解析符合标准的消息时非常准确,并且在解析不符合要求的消息方面做得非常好,提供了有关如何将消息视为损坏的信息。它将使用在消息中发现的所有问题的列表填充消息对象的defects属性。请参见email.errors模块以获取可以找到的缺陷列表。

这是BytesFeedParser的 API:

如果指定了* policy ,则使用它指定的规则来更新消息的表示形式。如果未设置 policy ,请使用compat32策略,该策略与电子邮件包的 Python 3.2 版本保持向后兼容性,并提供Message作为默认工厂。所有其他策略均提供EmailMessage作为默认 _factory 。有关其他 policy *控件的更多信息,请参见policy文档。

注意: 应该始终指定 policy 关键字 ;在 Future 的 Python 版本中,默认值将更改为email.policy.default

3.2 版中的新Function。

在版本 3.3 中进行了更改:添加了* policy *关键字。

在版本 3.6 中更改:* _factory *默认为策略message_factory

在版本 3.3 中进行了更改:添加了* policy *关键字。

Parser API

email.parser模块导入的BytesParser类提供了一个 API,当消息的完整内容在bytes-like object或文件中可用时,该 API 可用于解析消息。 email.parser模块还提供Parser用于解析字符串,以及仅 Headers 的解析器BytesHeaderParserHeaderParser,如果您仅对消息的 Headers 感兴趣,可以使用它们。在这些情况下,BytesHeaderParserHeaderParser可以更快,因为它们不try解析消息正文,而是将有效负载设置为原始正文。

注意: 应该始终指定 policy 关键字 ;在 Future 的 Python 版本中,默认值将更改为email.policy.default

在版本 3.3 中进行了更改:删除了 2.4 中不推荐使用的* strict 参数。添加了 policy *关键字。

在版本 3.6 中更改:* _class *默认为策略message_factory

可选的* headersonly *是一个标志,用于指定是否在读取标题后停止解析。默认值为False,这意味着它将解析文件的全部内容。

可选的* headersonly *与parse()方法相同。

3.2 版中的新Function。

版本 3.3 中的新Function。

在版本 3.3 中更改:删除了* strict 参数。添加了 policy *关键字。

在版本 3.6 中更改:* _class *默认为策略message_factory

除了文本模式要求之外,此方法的运行方式类似于BytesParser.parse()

可选的* headersonly *与parse()方法相同。

由于从字符串或文件对象创建消息对象结构是一种常见的任务,因此为方便起见,提供了四个Function。它们在顶级email软件包名称空间中可用。

3.2 版中的新Function。

在版本 3.3 中更改:删除了* strict 参数。添加了 policy *关键字。

3.2 版中的新Function。

在版本 3.3 中更改:删除了* strict 参数。添加了 policy *关键字。

在版本 3.3 中更改:删除了* strict 参数。添加了 policy *关键字。

在版本 3.3 中更改:删除了* strict 参数。添加了 policy *关键字。

在版本 3.6 中更改:* _class *默认为策略message_factory

以下是在交互式 Python 提示符下如何使用message_from_bytes()的示例:

>>> import email
>>> msg = email.message_from_bytes(myBytes)

Additional notes

以下是有关解析语义的一些注意事项:

首页