email.parser :分析电子邮件

源代码: Lib/email/parser.py


消息对象结构可以通过以下两种方式之一创建:通过创建 EmailMessage 对象,使用字典接口添加头,使用 set_content() 以及相关的方法,或者可以通过解析电子邮件消息的序列化表示来创建这些方法。

这个 email 包提供了一个标准的解析器,可以理解大多数电子邮件文档结构,包括mime文档。您可以将一个字节、字符串或文件对象传递给解析器,解析器将返回到您的根目录。 EmailMessage 对象结构的实例。对于简单的非MIME消息,这个根对象的有效负载可能是一个包含消息文本的字符串。对于mime消息,根对象将返回 True 从其 is_multipart() 方法,子部件可以通过有效载荷操作方法访问,例如 get_body()iter_parts()walk() .

实际上有两个解析器接口可供使用,即 Parser API和增量 FeedParser 应用程序编程接口。这个 Parser 如果消息的整个文本都在内存中,或者整个消息都保存在文件系统的一个文件中,那么API最有用。 FeedParser 当您从流中读取消息时更合适,该流可能会阻止等待更多输入(例如从套接字读取电子邮件消息)。这个 FeedParser 可以递增地使用和分析消息,并且仅在关闭分析器时返回根对象。

注意,解析器可以以有限的方式进行扩展,当然您可以从头开始完全实现自己的解析器。所有连接 email 包的绑定解析器和 EmailMessage 类体现在 policy 类,以便自定义分析器可以通过实现适当的 policy 方法。

前馈分析器API

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

这个 BytesFeedParser 的API很简单;您可以创建一个实例,向它馈送大量的字节,直到没有更多的字节来馈送它,然后关闭解析器来检索根消息对象。这个 BytesFeedParser 在解析符合标准的消息时非常准确,并且它在解析不符合标准的消息方面做得非常好,提供了有关消息如何被视为损坏的信息。它将填充消息对象的 defects 属性,其中包含在消息中发现的任何问题的列表。见 email.errors 模块,用于查找缺陷列表。

这是 BytesFeedParser

class email.parser.BytesFeedParser(_factory=None, *, policy=policy.compat32)

创建一个 BytesFeedParser 实例。可选的 _factory 不是可调用的无参数;如果未指定,请使用 message_factorypolicy . 调用 _factory 每当需要新的消息对象时。

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

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

3.2 新版功能.

在 3.3 版更改: 增加了 policy 关键字。

在 3.6 版更改: _factory 默认为策略 message_factory .

feed(data)

向解析器提供更多数据。 data 应该是 bytes-like object 包含一行或多行。行可以是部分的,解析器将这些部分行正确地缝合在一起。行可以有三个公共行结尾中的任意一个:回车、换行或回车和换行(它们甚至可以混合)。

close()

完成对所有以前输入的数据的分析,并返回根消息对象。不确定如果 feed() 在调用此方法之后调用。

class email.parser.FeedParser(_factory=None, *, policy=policy.compat32)

作品像 BytesFeedParser 除了输入到 feed() 方法必须是字符串。这是有限的实用程序,因为这种消息有效的唯一方法是它只包含ASCII文本,或者,如果 utf8True ,没有二进制附件。

在 3.3 版更改: 增加了 policy 关键字。

语法分析器API

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

class email.parser.BytesParser(_class=None, *, policy=policy.compat32)

创建一个 BytesParser 实例。这个 _classpolicy 参数的含义和语义与 _factorypolicy 参数 BytesFeedParser .

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

在 3.3 版更改: 移除 strict 在2.4中被否决的参数。增加了 policy 关键字。

在 3.6 版更改: _class 默认为策略 message_factory .

parse(fp, headersonly=False)

从二进制文件中读取所有数据,如对象 fp ,分析结果字节,并返回消息对象。 fp 必须同时支持 readline() 以及 read() 方法。

中包含的字节 fp 必须格式化为 RFC 5322 (或,如果 utf8TrueRFC 6532 )样式标题和标题接续行,可选前面加信封标题。头段块由数据结尾或空行终止。在头块后面是消息体(可能包含mime编码的子部分,包括带有 Content-Transfer-Encoding 属于 8bit

可选的 仅限头部 是一个标志,指定在读取头之后是否停止解析。默认值为 False ,表示它解析文件的全部内容。

parsebytes(bytes, headersonly=False)

类似于 parse() 方法,但它需要 bytes-like object 而不是像文件一样的对象。在上调用此方法 bytes-like object 相当于封装 字节 在一个 BytesIO 先实例后调用 parse() .

可选的 仅限头部 是与 parse() 方法。

3.2 新版功能.

class email.parser.BytesHeaderParser(_class=None, *, policy=policy.compat32)

恰似 BytesParser 除了 仅限头部 默认为 True .

3.3 新版功能.

class email.parser.Parser(_class=None, *, policy=policy.compat32)

这个类与 BytesParser ,但处理字符串输入。

在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。

在 3.6 版更改: _class 默认为策略 message_factory .

parse(fp, headersonly=False)

像对象一样从文本模式文件读取所有数据 fp ,分析结果文本,并返回根消息对象。 fp 必须同时支持 readline() 以及 read() 文件类对象的方法。

除了文本模式要求,此方法的操作方式如下 BytesParser.parse() .

parsestr(text, headersonly=False)

类似于 parse() 方法,但它采用字符串对象而不是类似文件的对象。对字符串调用此方法等同于封装 text 在一个 StringIO 先实例后调用 parse() .

可选的 仅限头部 是与 parse() 方法。

class email.parser.HeaderParser(_class=None, *, policy=policy.compat32)

恰似 Parser 除了 仅限头部 默认为 True .

由于从字符串或文件对象创建消息对象结构是一项常见的任务,因此提供了四个函数作为方便。它们是顶级的 email 包命名空间。

email.message_from_bytes(s, _class=None, *, policy=policy.compat32)

从返回消息对象结构 bytes-like object . 这相当于 BytesParser().parsebytes(s) . 可选的 _classpolicy 被解释为 BytesParser 类构造函数。

3.2 新版功能.

在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。

email.message_from_binary_file(fp, _class=None, *, policy=policy.compat32)

从打开的二进制文件返回消息对象结构树 file object . 这相当于 BytesParser().parse(fp) . _classpolicy 被解释为 BytesParser 类构造函数。

3.2 新版功能.

在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。

email.message_from_string(s, _class=None, *, policy=policy.compat32)

从字符串返回消息对象结构。这相当于 Parser().parsestr(s) . _classpolicy 被解释为 Parser 类构造函数。

在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。

email.message_from_file(fp, _class=None, *, policy=policy.compat32)

从打开的消息对象结构树返回消息对象结构树 file object .这相当于 Parser().parse(fp) . _classpolicy 被解释为 Parser 类构造函数。

在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。

在 3.6 版更改: _class 默认为策略 message_factory .

下面是一个您可以使用的示例 message_from_bytes() 在交互式python提示下:

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

附加说明

下面是一些关于解析语义的注释:

  • 大多数非 multipart 类型消息被解析为具有字符串有效负载的单个消息对象。这些对象将返回 False 对于 is_multipart()iter_parts() 将生成一个空列表。

  • 所有 multipart 类型消息将被解析为一个容器消息对象,其中包含其有效负载的子消息对象列表。外部容器消息将返回 True 对于 is_multipart()iter_parts() 将生成子部分列表。

  • 内容类型为的大多数邮件 message/* (如 message/delivery-statusmessage/rfc822 )也将被解析为包含长度为1的列表有效负载的容器对象。他们 is_multipart() 方法将返回 True . 单一元素由 iter_parts() 将是子消息对象。

  • 一些不符合标准的消息可能在内部不一致 multipart 爱滋病。这些信息可能有 Content-Type 类型报头 multipart 但他们 is_multipart() 方法可能返回 False . 如果使用 FeedParser ,它们将具有 MultipartInvariantViolationDefect 他们班 缺陷 属性列表。见 email.errors 有关详细信息。