18.1. email — 电子邮件和 MIME 处理包 — Python 文档
18.1. 电子邮件 — 电子邮件和 MIME 处理包
2.2 版中的新功能。
email 包是一个用于管理电子邮件消息的库,包括 MIME 和其他基于 RFC 2822 的消息文档。 它包含了几个较旧的标准模块中的大部分功能,例如 rfc822、mimetools、multifile 和其他非标准包,例如 mimecntl
]。 它专门用于向 SMTP (RFC 2821)、NNTP 或其他服务器发送电子邮件; 这些是模块的功能,例如 smtplib 和 nntplib。 email 包尝试尽可能符合 RFC,除了支持 RFC 2822,如 等 MIME 相关的 RFC RFC 2045、RFC 2046、RFC 2047和[X2256X]RFC 256X] 2231。
email 包的主要区别在于它将电子邮件消息的解析和生成与电子邮件的内部 对象模型 表示分开。 使用 email 包的应用程序主要处理对象; 您可以向消息添加子对象、从消息中删除子对象、完全重新排列内容等。 有一个单独的解析器和一个单独的生成器,用于处理从平面文本到对象模型的转换,然后再返回到平面文本。 对于一些常见的 MIME 对象类型,还有一些方便的子类,以及一些有助于处理诸如提取和解析消息字段值、创建符合 RFC 兼容的日期等常见任务的杂项实用程序。
以下部分描述了 email 包的功能。 排序遵循在应用程序中应该很常见的过程:从文件或其他来源读取电子邮件消息作为纯文本,解析文本以生成电子邮件消息的对象结构,操纵该结构,最后,对象树被渲染回纯文本。
用整块布料创建对象结构是完全可行的——即 完全从头开始。 从那里,可以采取与上述类似的进展。
还包括 email 包提供的所有类和模块的详细规范、您在使用 email 包时可能遇到的异常类、一些辅助实用程序和一些示例。 对于旧的 mimelib
包或 email 包的早期版本的用户,提供了关于差异和移植的部分。
email 包文档的内容:
- 18.1.1.
email.message
:表示电子邮件 - 18.1.2.
email.parser
:解析电子邮件 - 18.1.3.
email.generator
:生成 MIME 文档 - 18.1.4.
email.mime
:从头开始创建电子邮件和 MIME 对象 - 18.1.5.
email.header
:国际化头文件 - 18.1.6.
email.charset
:代表字符集 - 18.1.7.
email.encoders
:编码器 - 18.1.8.
email.errors
:异常和缺陷类 - 18.1.9.
email.utils
:其他实用程序 - 18.1.10.
email.iterators
:迭代器 - 18.1.11.
email
:示例
18.1.12. 包裹历史
此表描述了电子邮件包的发布历史,对应于发布包的 Python 版本。 出于本文档的目的,当您看到有关更改或添加版本的注释时,这些是指进行更改的 Python 版本, 不是 电子邮件包版本。 此表还描述了每个版本的包的 Python 兼容性。
电子邮件版本 | 分布于 | 兼容 |
---|---|---|
1.x
|
Python 2.2.0 到 Python 2.2.1 | 不再支持 |
2.5
|
Python 2.2.2+ 和 Python 2.3 | Python 2.1 到 2.5 |
3.0
|
蟒蛇 2.4 | Python 2.3 到 2.5 |
4.0
|
蟒蛇 2.5 | Python 2.3 到 2.5 |
以下是 email 版本 4 和版本 3 之间的主要区别:
所有模块都已根据 PEP 8 标准重命名。 例如,版本 3 模块
email.Message
在版本 4 中重命名为 email.message。添加了一个新的子包 email.mime,并且所有版本 3
email.MIME*
模块都被重命名并位于 email.mime 子包中。 例如,版本 3 模块email.MIMEText
被重命名为email.mime.text
。请注意,版本 3 名称将继续有效,直到 Python 2.6。
添加了
email.mime.application
模块,其中包含 MIMEApplication 类。版本 3 中已弃用的方法已被删除。 这些包括
Generator.__call__()
、Message.get_type()
、Message.get_main_type()
、Message.get_subtype()
。修复了 RFC 2231 支持,可以改变 Message.get_param 和朋友的一些返回类型。 在某些情况下,用于返回 3 元组的值现在返回简单字符串(特别是,如果所有扩展参数段都未编码,则不需要语言和字符集指定,因此返回类型现在是简单字符串)。 此外,%-d 编码曾经对编码和未编码的段进行; 这种解码现在只对编码段进行。
以下是 email 版本 3 和版本 2 之间的主要区别:
- 引入了 FeedParser 类,并根据 FeedParser 实现了 Parser 类。 因此,所有解析都是非严格的,解析将尽最大努力永远不会引发异常。 解析消息时发现的问题存储在消息的 defect 属性中。
- 在版本 2 中引发
DeprecationWarning
的 API 的所有方面都已被删除。 其中包括 MIMEText 构造函数的 _encoder 参数、Message.add_payload()
方法、Utils.dump_address_pair()
函数以及函数Utils.decode()
和Utils.encode()
。 - 新的
DeprecationWarning
已添加到:Generator.__call__()
、Message.get_type()
、Message.get_main_type()
、Message.get_subtype()
和 strict Parser 类的参数。 这些预计将在未来版本中删除。 - 已删除对 2.3 之前的 Python 的支持。
以下是 email 版本 2 和版本 1 之间的区别:
添加了
email.Header
和email.Charset
模块。Message 实例的 pickle 格式已更改。 由于这从未(现在仍然没有)正式定义,因此这不被视为向后不兼容。 但是,如果您的应用程序pickles 和unpickles Message 实例,请注意在 email 版本 2 中,Message 实例现在具有私有变量 _charset 和_default_type。
Message 类中的几个方法已被弃用,或者它们的签名已更改。 此外,还添加了许多新方法。 有关详细信息,请参阅 Message 类的文档。 更改应完全向后兼容。
面对 message/rfc822 内容类型,对象结构发生了变化。 在 email 版本 1 中,这种类型将由标量负载表示,即 容器消息的 is_multipart() 返回 false,get_payload() 不是列表对象,而是单个 Message 实例。
此结构与包的其余部分不一致,因此更改了 message/rfc822 内容类型的对象表示。 在 email 版本 2 中,容器 does 从 is_multipart() 返回
True
,并且 get_payload() 返回一个包含单个 Message 项目的列表。请注意,这是一个无法完全保持向后兼容性的地方。 但是,如果您已经在测试 get_payload() 的返回类型,则应该没问题。 您只需要确保您的代码不会在内容类型为 message/rfc822 的容器上使用 Message 实例执行 set_payload()。
添加了 Parser 构造函数的 strict 参数,其 parse() 和 parsestr() 方法增加了 headersonly ] 争论。 strict 标志也被添加到函数 email.message_from_file() 和 email.message_from_string()。
Generator.__call__()
已弃用; 改用 Generator.flatten。 Generator 类也增加了 clone() 方法。添加了 email.generator 模块中的 DecodedGenerator 类。
添加了中间基类 MIMENonMultipart 和 MIMEMultipart,并插入到大多数其他 MIME 相关派生类的类层次结构中。
MIMEText 构造函数的 _encoder 参数已被弃用。 编码现在基于 _charset 参数隐式发生。
email.Utils
模块中的以下功能已被弃用:dump_address_pairs()
、decode()
和encode()
。 模块新增以下功能:make_msgid()
、decode_rfc2231()
、encode_rfc2231()
、decode_params()
。添加了非公共函数
email.Iterators._structure()
。
18.1.13. 与mimelib
email 包最初的原型是一个名为 mimelib 的独立库。 已进行更改以使方法名称更加一致,并且已添加或删除某些方法或模块。 一些方法的语义也发生了变化。 在大多数情况下,mimelib
中可用的任何功能在 email 包中仍然可用,尽管通常以不同的方式。 mimelib
包和 email 包之间的向后兼容性不是优先事项。
这里简要说明了 mimelib
和 email 软件包之间的区别,以及有关如何移植应用程序的提示。
当然,这两个包最明显的区别就是包名改成了email。 此外,顶级包还有以下区别:
messageFromString()
已重命名为 message_from_string()。messageFromFile()
已重命名为 message_from_file()。
Message 类有以下区别:
- 方法
asString()
被重命名为 as_string()。 - 方法
ismultipart()
被重命名为 is_multipart()。 - get_payload() 方法增加了一个 decode 可选参数。
- 方法
getall()
被重命名为 get_all()。 - 方法
addheader()
被重命名为 add_header()。 - 方法
gettype()
重命名为get_type()
。 - 方法
getmaintype()
重命名为get_main_type()
。 - 方法
getsubtype()
重命名为get_subtype()
。 - 方法
getparams()
被重命名为 get_params()。 此外,虽然getparams()
返回一个字符串列表,get_params() 返回一个 2 元组列表,实际上是参数的键/值对,在'='
上拆分] 标志。 - 方法
getparam()
被重命名为 get_param()。 - 方法
getcharsets()
被重命名为 get_charsets()。 - 方法
getfilename()
被重命名为 get_filename()。 - 方法
getboundary()
被重命名为 get_boundary()。 - 方法
setboundary()
重命名为 set_boundary()。 - 方法
getdecodedpayload()
已删除。 要获得类似的功能,请将值 1 传递给 get_payload() 方法的 decode 标志。 - 方法
getpayloadastext()
已删除。 email.generator 模块中的 DecodedGenerator 类支持类似的功能。 - 方法
getbodyastext()
已删除。 您可以通过在 email.iterators 模块中使用 typed_subpart_iterator() 创建迭代器来获得类似的功能。
Parser 类的公共接口没有区别。 它确实有一些额外的智能来识别 message/delivery-status 类型的消息,它表示为 Message 实例,其中包含单独的 Message 子部分,用于交货状态通知 1。
Generator 类的公共接口没有区别。 email.generator 模块中有一个新类,称为 DecodedGenerator,它提供了以前在 Message.getpayloadastext()
方法中可用的大部分功能。
以下模块和类已更改:
MIMEBase 类构造函数参数 _major 和 _minor 已分别更改为 _maintype 和 _subtype。
Image
类/模块已重命名为MIMEImage
。 _minor 参数已重命名为 _subtype。Text
类/模块已重命名为MIMEText
。 _minor 参数已重命名为 _subtype。MessageRFC822
类/模块已重命名为MIMEMessage
。 请注意,早期版本的mimelib
将此类/模块称为RFC822
,但这与 Python 标准库模块 rfc822 在某些不区分大小写的文件系统上发生冲突。此外,MIMEMessage 类现在表示具有主要类型 message 的任何类型的 MIME 消息。 它需要一个可选参数 _subtype,用于设置 MIME 子类型。 _subtype 默认为 rfc822。
mimelib
在其 address
和 date
模块中提供了一些实用功能。 所有这些功能都已移至 email.utils 模块。
MsgReader
类/模块已被删除。 它的功能在 email.iterators 模块中的 body_line_iterator() 函数中得到了最密切的支持。
脚注