email.contentmanager :管理MIME内容

源代码: Lib/email/contentmanager.py


3.6 新版功能: 1

class email.contentmanager.ContentManager

内容管理器的基类。提供标准的注册表机制来注册mime内容和其他表示形式之间的转换器,以及 get_contentset_content 调度方法。

get_content(msg, *args, **kw)

根据 mimetype 属于 msg (见下一段),调用它,传递所有参数,并返回调用的结果。期望处理程序将从 msg 并返回一个对提取数据的信息进行编码的对象。

要查找处理程序,请在注册表中查找以下键,并在找到第一个键后停止:

  • 表示完整mime类型的字符串 (maintype/subtype

  • 表示 maintype

  • 空字符串

如果这些键都不生成处理程序,则引发 KeyError 对于完整的mime类型。

set_content(msg, obj, *args, **kw)

如果 maintypemultipart 举起一个 TypeError ;否则,根据 obj (见下一段),调用 clear_content()msg ,并调用处理程序函数,传递所有参数。期望处理程序将转换和存储 obj 进入之内 msg ,可能对 msg 此外,例如添加各种mime头来编码解释存储数据所需的信息。

要查找处理程序,请获取 obj (typ = type(obj) ,并在注册表中查找以下项,在找到第一个项时停止:

  • 类型本身 (typ

  • 类型的完全限定名 (typ.__module__ +''+类型。uuqualname_uuu)。

  • 类型的qualname (typ.__qualname__

  • 类型名称 (typ.__name__

如果上面没有匹配项,请对中的每种类型重复上面的所有检查。 MRO (typ.__mro__ )最后,如果没有其他键生成处理程序,请检查该键的处理程序 None . 如果没有处理程序 None 举起一个 KeyError 用于类型的完全限定名。

还添加了 MIME-Version 如果不存在标题(另请参见 MIMEPart

add_get_handler(key, handler)

记录功能 处理程序 作为 key . 对于可能的值 keyget_content() .

add_set_handler(typekey, handler)

记录 处理程序 当类型匹配的对象 键槽 传递给 set_content() . 对于可能的值 键槽set_content() .

内容管理器实例

目前,电子邮件包只提供一个具体的内容管理器, raw_data_manager 尽管将来可能会增加更多。 raw_data_managercontent_manager 提供的 EmailPolicy 及其衍生产品。

email.contentmanager.raw_data_manager

此内容管理器仅提供一个超出 Message 本身:它只处理文本、原始字节字符串,以及 Message 物体。然而,与基本API相比,它提供了显著的优势: get_content 文本部分将返回一个Unicode字符串,而应用程序不需要手动对其进行解码, set_content 提供了一组丰富的选项,用于控制添加到部件的标题和控制内容传输编码,并允许使用 add_ 方法,从而简化多部分消息的创建。

email.contentmanager.get_content(msg, errors='replace')

以字符串形式返回部件的有效负载(对于 text 部分) EmailMessage 对象(用于 message/rfc822 零件),或 bytes 对象(用于所有其他非多部分类型)。举起一个 KeyError 如果调用 multipart .如果零件是 text 部分和 errors 已指定,在将负载解码为Unicode时将其用作错误处理程序。默认错误处理程序是 replace .

email.contentmanager.set_content(msg, <'str'>, subtype="plain", charset='utf-8', cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)
email.contentmanager.set_content(msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None)
email.contentmanager.set_content(msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

将头和负载添加到 msg

添加 Content-Type 头与A maintype/subtype 价值。

  • 为了 str ,设置mime maintypetext ,并将子类型设置为 subtype 如果有规定,或 plain 如果不是。

  • 为了 bytes ,使用指定的 主型subtype 或提高 TypeError 如果没有指定。

  • 为了 EmailMessage 对象,将maintype设置为 message ,并将子类型设置为 subtype 如果有规定或 rfc822 如果不是。如果 subtypepartial ,引发错误 (bytes 必须使用对象来构造 message/partial 零件)。

如果 charset 提供(仅对 str ,使用指定的字符集将字符串编码为字节。默认值为 utf-8 . 如果指定 charset 是标准mime字符集名称的已知别名,请改用标准字符集。

如果 cte 设置,使用指定的内容传输编码对负载进行编码,并设置 Content-Transfer-Encoding 标题到该值。的可能值 ctequoted-printablebase647bit8bitbinary .如果输入不能用指定的编码进行编码(例如,指定 cte 属于 7bit 对于包含非ASCII值的输入,引发 ValueError .

  • 为了 str 对象,如果 cte 未设置使用试探法确定最紧凑的编码。

  • 为了 EmailMessage , per RFC 2046 ,如果 cte 属于 quoted-printablebase64 请求 subtype rfc822 和任何 cte 以外 7bit 对于 subtype external-body . 为了 message/rfc822 使用 8bit 如果 cte 未指定。所有其他值 subtype 使用 7bit .

注解

A cte 属于 binary 实际上还不能正常工作。这个 EmailMessage 对象修改者 set_content 是正确的,但是 BytesGenerator 无法正确序列化。

如果 性情 已设置,将其用作 Content-Disposition 标题。如果未指定,以及 filename 如果指定了,则添加带有值的标题 attachment .如果 性情 未指定,并且 filename 也未指定,不添加标题。的唯一有效值 性情attachmentinline .

如果 filename 是指定的,将其用作 filename 的参数 Content-Disposition 标题。

如果 cid 已指定,请添加 Content-ID 标题与 cid 作为其价值。

如果 帕拉姆 指定,循环其 items 方法和使用结果 (key, value) 成对设置 Content-Type 标题。

如果 headers 是指定的,并且是表单的字符串列表 headername: headervalue 或一览表 header 对象(通过具有 name 属性),将标题添加到 msg .

脚注

1

最初在3.4中作为 provisional module