email
— 电子邮件和 MIME 处理包¶
email
包是一个用于管理电子邮件消息的库。它专门不设计用于向 SMTP (RFC 2821),NNTP 或其他服务器发送电子邮件消息;这些是诸如 smtplib
等模块的功能。email
包尝试尽可能符合 RFC 标准,支持 RFC 5322 和 RFC 6532,以及诸如 RFC 2045,RFC 2046,RFC 2047,RFC 2183 和 RFC 2231 等 MIME 相关 RFC。
电子邮件包的总体结构可以分为三个主要组件,加上一个控制其他组件行为的第四个组件。
该软件包的核心组件是表示电子邮件消息的“对象模型”。应用程序主要通过 message
子模块中定义的对象模型接口与该软件包进行交互。应用程序可以使用此 API 来询问有关现有电子邮件的问题,构造新的电子邮件,或者添加或删除本身使用相同对象模型接口的电子邮件子组件。也就是说,遵循电子邮件消息及其 MIME 子组件的性质,电子邮件对象模型是一个对象树结构,它们都提供 EmailMessage
API。
该软件包的另外两个主要组件是 parser
和 generator
。解析器获取电子邮件消息的序列化版本(字节流),并将其转换为 EmailMessage
对象的树。生成器获取 EmailMessage
并将其转回序列化的字节流。(解析器和生成器也处理文本字符流,但是不建议使用此方法,因为它太容易导致消息以某种方式无效。)
控制组件是 policy
模块。每个 EmailMessage
,每个 generator
和每个 parser
都有一个关联的 policy
对象来控制其行为。通常,只有在创建 EmailMessage
时,应用程序才需要指定策略,即通过直接实例化 EmailMessage
来创建新电子邮件,或者使用 parser
来解析输入流。但是,可以使用 generator
序列化消息时更改策略。例如,这允许从磁盘解析通用电子邮件消息,但在将其发送到电子邮件服务器时使用标准 SMTP 设置对其进行序列化。
电子邮件包尽力向应用程序隐藏各种管理 RFC 的详细信息。从概念上讲,应用程序应该能够将电子邮件消息视为 unicode 文本和二进制附件的结构化树,而不必担心序列化时如何表示这些内容。但是,在实践中,通常至少需要了解一些管理 MIME 消息及其结构的规则,特别是 MIME “内容类型”的名称和性质,以及它们如何识别多部分文档。在大多数情况下,此知识仅应为更复杂的应用程序所必需,即使这样,也应该仅是所讨论的高级结构,而不是如何表示这些结构的详细信息。由于 MIME 内容类型广泛用于现代互联网软件(不仅是电子邮件),因此对于许多程序员来说,这将是一个熟悉的概念。
以下部分介绍了 email
包的功能。我们从 message
对象模型开始,它是应用程序将使用的主要接口,然后是 parser
和 generator
组件。然后,我们介绍 policy
控制,它完成了对该库主要组件的处理。
接下来的三个部分介绍了该软件包可能引发的异常以及 parser
可能检测到的缺陷(不符合 RFC)。然后,我们介绍了 headerregistry
和 contentmanager
子组件,它们提供了用于更详细地操作标题和有效负载的工具。这两个组件都包含与使用和生成非平凡消息相关的功能,但也记录了它们的可扩展性 API,这将是高级应用程序感兴趣的。
接下来是一系列使用前面部分中介绍的 API 基本部分的示例。
以上代表了电子邮件包的现代(unicode 友好)API。其余部分,从 Message
类开始,介绍了与电子邮件消息的表示方式的细节直接相关的旧式 compat32
API。 compat32
API 不向应用程序隐藏 RFC 的详细信息,但是对于需要在该级别上运行的应用程序,它们可能是有用的工具。对于出于向后兼容性原因仍在使用 compat32
API 的应用程序,本文档也适用。
在 3.6 版本中更改:文档进行了重组和重写,以推广新的 EmailMessage
/EmailPolicy
API。
email
包文档的内容
email.message
: 表示电子邮件消息EmailMessage
as_string()
__str__()
as_bytes()
__bytes__()
is_multipart()
set_unixfrom()
get_unixfrom()
__len__()
__contains__()
__getitem__()
__setitem__()
__delitem__()
keys()
values()
items()
get()
get_all()
add_header()
replace_header()
get_content_type()
get_content_maintype()
get_content_subtype()
get_default_type()
set_default_type()
set_param()
del_param()
get_filename()
get_boundary()
set_boundary()
get_content_charset()
get_charsets()
is_attachment()
get_content_disposition()
walk()
get_body()
iter_attachments()
iter_parts()
get_content()
set_content()
make_related()
make_alternative()
make_mixed()
add_related()
add_alternative()
add_attachment()
clear()
clear_content()
preamble
epilogue
defects
MIMEPart
email.parser
: 解析电子邮件消息email.generator
: 生成 MIME 文档email.policy
: Policy 对象email.errors
: 异常和缺陷类email.headerregistry
: 自定义标头对象email.contentmanager
: 管理 MIME 内容email
: 示例
传统 API
email.message.Message
: 使用compat32
API 表示电子邮件消息Message
as_string()
__str__()
as_bytes()
__bytes__()
is_multipart()
set_unixfrom()
get_unixfrom()
attach()
get_payload()
set_payload()
set_charset()
get_charset()
__len__()
__contains__()
__getitem__()
__setitem__()
__delitem__()
keys()
values()
items()
get()
get_all()
add_header()
replace_header()
get_content_type()
get_content_maintype()
get_content_subtype()
get_default_type()
set_default_type()
get_params()
get_param()
set_param()
del_param()
set_type()
get_filename()
get_boundary()
set_boundary()
get_content_charset()
get_charsets()
get_content_disposition()
walk()
preamble
epilogue
defects
email.mime
: 从头开始创建电子邮件和 MIME 对象email.header
: 国际化标头email.charset
: 表示字符集email.encoders
: 编码器email.utils
: 杂项工具email.iterators
: 迭代器