On this page
18.1.4. email.mime:从头开始创建电子邮件和 MIME 对象
通常,pass将文件或某些文本传递给解析器来获得消息对象结构,该解析器将解析文本并返回根消息对象。但是,您也可以从头开始构建完整的消息结构,甚至可以手动构建单个Message对象。实际上,您还可以采用现有结构并添加新的Message对象,将它们移动等等。这为 MIME 消息的切片和切块提供了非常方便的界面。
您可以pass创建Message实例,手动添加附件和所有适当的标题来创建新的对象结构。但是对于 MIME 邮件,email包提供了一些方便的子类来使事情变得更容易。
这些是类:
-
- class *
email.mime.base.
MIMEBase
(* _maintype , _subtype ,** _ params *)
- 模块:
email.mime.base
- class *
这是Message的所有 MIME 特定子类的 Base Class。通常,您不会创建专门针对MIMEBase的实例,尽管可以。 MIMEBase主要是作为方便的 Base Class 提供的,用于更特定的 MIME 感知子类。
- _maintype 是 Content-Type 主要类型(例如 text 或 image ), _subtype 是 Content-Type 次要类型(例如 plain 或 gif *)。 * _params *是参数键/值字典,并直接传递给Message.add_header。
MIMEBase类始终添加* Content-Type Headers(基于 _maintype , _subtype 和 _params )和 MIME-Version *Headers(始终设置为1.0
)。
- 类别
email.mime.nonmultipart.
MIMENonMultipart
- 模块:
email.mime.nonmultipart
- 模块:
MIMEBase的子类,这是非* multipart 的 MIME 消息的中间 Base Class。此类的主要目的是防止使用attach()方法,该方法仅对 multipart *消息有意义。如果调用attach(),则会引发MultipartConversionError异常。
版本 2.2.2 中的新Function。
-
- class *
email.mime.multipart.
MIMEMultipart
([* _subtype * [,* boundary * [,* _subparts * [,* _params *]]]])
- 模块:
email.mime.multipart
- class *
MIMEBase的子类,这是* multipart 的 MIME 消息的中间 Base Class。可选 _subtype 默认为 mixed *,但可用于指定消息的子类型。 * multipart/_subtype 的 Content-Type *头将被添加到消息对象。 * MIME-Version *Headers 也将被添加。
可选的* boundary *是 Multipart 边界字符串。如果为None
(默认值),则在需要时(例如,对消息进行序列化时)计算边界。
_subparts *是有效载荷的初始子部分序列。必须有可能将此序列转换为列表。您始终可以使用Message.attach方法将新的子部件附加到邮件中。
Content-Type Headers 的其他参数来自关键字参数,或传递到 _params *参数(这是关键字字典)中。
版本 2.2.2 中的新Function。
-
- class *
email.mime.application.
MIMEApplication
(* _data * [,* _subtype * [,* _encoder * [,*** _ params *]]])
- 模块:
email.mime.application
- class *
MIMENonMultipart的子类MIMEApplication用来表示主要类型* application *的 MIME 消息对象。 * _data 是一个包含原始字节数据的字符串。可选的 _subtype 指定 MIME 子类型,默认为 octet-stream *。
可选的* _encoder 是可调用的(即函数),它将对要传输的数据进行实际编码。此可调用对象采用一个参数,即MIMEApplication实例。它应使用get_payload()和set_payload()将有效负载更改为编码形式。它还应根据需要将任何 Content-Transfer-Encoding *或其他 Headers 添加到消息对象。默认编码为 base64.有关内置编码器的列表,请参见email.encoders模块。
- _params *直接传递给 Base Class 构造函数。
2.5 版的新Function。
-
- class *
email.mime.audio.
MIMEAudio
(* _audiodata * [,* _subtype * [,* _encoder * [,*** _ params *]]])
- 模块:
email.mime.audio
- class *
MIMENonMultipart的子类MIMEAudio用于创建主要类型* audio *的 MIME 消息对象。 * _audiodata 是包含原始音频数据的字符串。如果标准的 Python 模块sndhdr可以解码此数据,则子类型将自动包含在 Content-Type Headers 中。否则,您可以pass _subtype 参数显式指定音频子类型。如果无法猜测次要类型并且未提供 _subtype *,则引发TypeError。
可选的* _encoder 是可调用的(即函数),它将执行音频数据的实际编码以进行传输。此可调用对象采用一个参数,即MIMEAudio实例。它应使用get_payload()和set_payload()将有效负载更改为编码形式。它还应根据需要将任何 Content-Transfer-Encoding *或其他 Headers 添加到消息对象。默认编码为 base64.有关内置编码器的列表,请参见email.encoders模块。
- _params *直接传递给 Base Class 构造函数。
-
- class *
email.mime.image.
MIMEImage
(* _imagedata * [,* _subtype * [,* _encoder * [,*** _ params *]]])
- 模块:
email.mime.image
- class *
MIMENonMultipart的子类MIMEImage用于创建主要类型* image *的 MIME 消息对象。 * _imagedata 是包含原始图像数据的字符串。如果标准的 Python 模块imghdr可以解码此数据,则子类型将自动包含在 Content-Type Headers 中。否则,您可以pass _subtype 参数显式指定图像子类型。如果无法猜测次要类型并且未提供 _subtype *,则引发TypeError。
可选的* _encoder 是可调用的(即函数),它将对图像数据进行实际编码以进行传输。此可调用对象采用一个参数,即MIMEImage实例。它应使用get_payload()和set_payload()将有效负载更改为编码形式。它还应根据需要将任何 Content-Transfer-Encoding *或其他 Headers 添加到消息对象。默认编码为 base64.有关内置编码器的列表,请参见email.encoders模块。
- _params *直接传递给MIMEBase构造函数。
-
- class *
email.mime.message.
MIMEMessage
(* _msg * [,* _subtype *])
- 模块:
email.mime.message
- class *
MIMENonMultipart的子类MIMEMessage用于创建主要类型* message *的 MIME 对象。 * _msg *用作有效负载,并且必须是Message类(或其子类)的实例,否则引发TypeError。
可选的* _subtype 设置消息的子类型;它默认为 rfc822 *。
-
- class *
email.mime.text.
MIMEText
(* _text * [,* _subtype * [,* _charset *]])
- 模块:
email.mime.text
- class *
MIMENonMultipart的子类MIMEText用来创建主要类型* text *的 MIME 对象。 * _text *是有效负载的字符串。 * _subtype 是次要类型,默认为 plain *。 * _charset 是文本的字符集,并作为参数传递给MIMENonMultipart构造函数;它默认为us-ascii
。如果 _text 是 unicode,则使用 _charset 的 output_charset *进行编码,否则按原样使用。
在版本 2.4 中进行了更改:先前不推荐使用的* _encoding 参数已被删除。现在,内容传输编码基于 _charset *参数隐式地发生。
除非将_charset
参数显式设置为None
,否则创建的 MIMEText 对象将具有带有charset
参数的* Content-Type Headers 和 Content-Transfer-Encoding Headers。这意味着即使在set_payload
命令中传递了字符集,后续的set_payload
调用也不会导致编码的有效载荷。您可以pass删除Content-Transfer-Encoding
Headers 来“重置”此行为,然后set_payload
调用将自动对新的有效负载进行编码(并添加新的 Content-Transfer-Encoding *Headers)。