19.1.7. email.contentmanager:管理 MIME 内容 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/email.contentmanager
跳转至:导航、​搜索

19.1.7. 电子邮件内容管理器 : 管理 MIME 内容

源代码: :source:`Lib/email/contentmanager.py`



3.6 版新功能: 1


class email.contentmanager.ContentManager

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

get_content(msg, *args, **kw)

根据 msgmimetype 查找处理函数(见下一段),调用它,传递所有参数,并返回调用结果。 期望处理程序将从 msg 中提取有效载荷并返回一个对象,该对象对提取的数据的信息进行编码。

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

  • 代表完整 MIME 类型的字符串 (maintype/subtype)

  • 代表 maintype 的字符串

  • 空字符串


如果这些键都没有产生处理程序,则为完整的 MIME 类型引发 KeyError

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

如果 maintypemultipart,则引发 TypeError; 否则根据 obj 的类型查找处理函数(见下一段),在 msg 上调用 clear_content(),并调用处理函数,通过所有参数。 期望处理程序会将 obj 转换并存储到 msg,也可能对 msg 进行其他更改,例如添加各种 MIME 标头来编码信息需要解释存储的数据。

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

  • 类型本身(typ

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

  • 类型的 qualname (typ.__qualname__)

  • 类型的名称 (typ.__name__)。


如果以上都不匹配,则对 MRO (typ.__mro__) 中的每个类型重复上述所有检查。 最后,如果没有其他键产生处理程序,请检查键 None 的处理程序。 如果 None 没有处理程序,则为类型的完全限定名称引发 KeyError

如果不存在,还添加一个 MIME-Version 标头(另见 MIMEPart)。

add_get_handler(key, handler)

记录函数 handler 作为 key 的处理程序。 有关 key 的可能值,请参阅 get_content()

add_set_handler(typekey, handler)

记录 handler 作为匹配 typekey 类型的对象传递给 set_content() 时调用的函数。 typekey 的可能值见 set_content()

19.1.7.1. 内容管理器实例

目前,email 包只提供了一个具体的内容管理器,raw_data_manager,尽管将来可能会添加更多。 raw_data_managerEmailPolicy 及其衍生产品提供的 content_manager

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 对象返回(对于所有其他非多部分类型)。 如果在 multipart 上调用,则引发 KeyError。 如果该部分是 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 添加标头和有效载荷:

添加带有 maintype/subtype 值的 Content-Type 标头。

  • 对于 str,将 MIME maintype 设置为 text,如果指定,则将子类型设置为 subtype,如果指定,则设置为 plain它不是。

  • 对于 bytes,使用指定的 maintypesubtype,如果未指定,则引发 TypeError

  • 对于EmailMessage对象,设置maintype为message,子类型设置为subtype,如果没有指定,则设置为rfc822。 如果 subtypepartial,则引发错误(必须使用 bytes 对象来构造 message/partial 部件)。


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

如果设置了 cte,则使用指定的内容传输编码对有效负载进行编码,并将 Content-Transfer-Encoding 标头设置为该值。 cte 的可能值为 quoted-printablebase647bit8bitbinary。 如果输入无法以指定的编码进行编码(例如,为包含非 ASCII 值的输入指定 7bitcte),则引发 ValueError .

  • 对于 str 对象,如果未设置 cte,则使用启发式方法来确定最紧凑的编码。

  • 对于 EmailMessage,根据 RFC 2046,如果 quoted-printablebase64cte 引发错误subtype rfc822cte 以外的任何 7bit 需要 subtype external-body . 对于 message/rfc822,如果未指定 cte,则使用 8bit。 对于 subtype 的所有其他值,请使用 7bit


笔记

binarycte 实际上还不能正常工作。 由 set_content 修改的 EmailMessage 对象是正确的,但 BytesGenerator 没有正确序列化它。

如果设置了 disposition,则将其用作 Content-Disposition 标头的值。 如果未指定,并且指定了 filename,则添加值为 attachment 的标题。 如果未指定 disposition 且未指定 filename,则不要添加标题。 disposition 的唯一有效值是 attachmentinline

如果指定了 filename,则将其用作 Content-Disposition 标头的 filename 参数的值。

如果指定了 cid,则添加一个 Content-ID 标头,其中 cid 作为其值。

如果指定了 params,则迭代其 items 方法并使用生成的 (key, value) 对在 Content-Type 标头上设置其他参数。

如果指定了 headers 并且是 headername: headervalue 形式的字符串列表或 header 对象的列表(通过具有 name 属性与字符串区分开来) ),将标题添加到 msg

脚注

1
最初在 3.4 中作为 临时模块 添加