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_factory
从 policy . 调用 _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 包含一行或多行。行可以是部分的,解析器将这些部分行正确地缝合在一起。行可以有三个公共行结尾中的任意一个:回车、换行或回车和换行(它们甚至可以混合)。
- class email.parser.FeedParser(_factory=None, *, policy=policy.compat32)¶
作品像
BytesFeedParser
除了输入到feed()
方法必须是字符串。这是有限的实用程序,因为这种消息有效的唯一方法是它只包含ASCII文本,或者,如果utf8
是True
,没有二进制附件。在 3.3 版更改: 增加了 policy 关键字。
语法分析器API¶
这个 BytesParser
类,从导入 email.parser
模块,提供一个API,当消息的完整内容在 bytes-like object 或文件。这个 email.parser
模块还提供 Parser
用于分析字符串和仅头分析器, BytesHeaderParser
和 HeaderParser
,如果您只对消息头感兴趣,则可以使用它。 BytesHeaderParser
和 HeaderParser
在这些情况下可能更快,因为它们不尝试解析消息体,而是将有效负载设置为原始体。
- class email.parser.BytesParser(_class=None, *, policy=policy.compat32)¶
创建一个
BytesParser
实例。这个 _class 和 policy 参数的含义和语义与 _factory 和 policy 参数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 (或,如果
utf8
是True
, RFC 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()
.
- 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)
. 可选的 _class 和 policy 被解释为BytesParser
类构造函数。3.2 新版功能.
在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。
- email.message_from_binary_file(fp, _class=None, *, policy=policy.compat32)¶
从打开的二进制文件返回消息对象结构树 file object . 这相当于
BytesParser().parse(fp)
. _class 和 policy 被解释为BytesParser
类构造函数。3.2 新版功能.
在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。
- email.message_from_string(s, _class=None, *, policy=policy.compat32)¶
从字符串返回消息对象结构。这相当于
Parser().parsestr(s)
. _class 和 policy 被解释为Parser
类构造函数。在 3.3 版更改: 移除 strict 参数。增加了 policy 关键字。
- email.message_from_file(fp, _class=None, *, policy=policy.compat32)¶
从打开的消息对象结构树返回消息对象结构树 file object .这相当于
Parser().parse(fp)
. _class 和 policy 被解释为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-status 和 message/rfc822 )也将被解析为包含长度为1的列表有效负载的容器对象。他们
is_multipart()
方法将返回True
. 单一元素由iter_parts()
将是子消息对象。一些不符合标准的消息可能在内部不一致 multipart 爱滋病。这些信息可能有 Content-Type 类型报头 multipart 但他们
is_multipart()
方法可能返回False
. 如果使用FeedParser
,它们将具有MultipartInvariantViolationDefect
他们班 缺陷 属性列表。见email.errors
有关详细信息。