email.contentmanager:管理MIME内容

源代码: Lib / email / contentmanager.py


版本3.6中新增: [1]

class email.contentmanager.ContentManager

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

get_content (msg, *args, **kw

根据mimetypemsg查看处理函数(参见nextparagraph),调用它,传递所有参数,然后返回调用的结果。期望处理程序将从msg中提取payload并返回一个对象,该对象对提取的数据进行编码.

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

如果这些键都没有产生处理程序,请为完整的MIME类型提高KeyError

set_contentmsg, obj, *args, **kw)

如果maintypemultipart,举起TypeError;其他根据obj的类型获取处理函数(见下一段),在clear_content()上调用msg,并调用处理函数,传递所有参数。期望是处理程序将转换并存储objmsg,可能对进行其他更改msg同时,例如添加各种MIME标头来编码解释storeddata所需的信息.

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

  • 类型本身(typ
  • 类型的完全限定名称(typ.__module__ + "." +typ.__qualname__).
  • 类型的名字(typ.__qualname__
  • 类型的名称(typ.__name__).

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

另外加一个MIME-Version标题如果不存在(参见MIMEPart).

add_get_handlerkey, handler

记录功能handler作为key。对于key,见get_content().

add_set_handlertypekey, handler

记录handler当一个类型匹配的对象typekey被传递给set_content()时调用的函数。对于typekey的可能值,请参阅set_content().

内容管理器实例

目前电子邮件包只提供一个具体的内容管理器raw_data_manager,虽然将来可能会添加更多.raw_data_managercontent_managerEmailPolicy提供它的衍生物

email.contentmanager.raw_data_manager

这个内容管理器只提供了Message本身提供的最小接口:它只处理text,rawbyte字符串和Message对象。然而,与基本API相比,它提供了显着的优势:get_content文本部分将返回一个unicode字符串而不需要手动解码它,set_content提供了一组丰富的选项来控制添加到部件中的标题并控制内容传输,并且它可以使用各种add_方法,简化多部分信息的创建.

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

将部分的有效负载返回为字符串(对于text部分),一个EmailMessage物体(message/rfc822部分),或bytes对象(适用于所有其他非多部分类型)。Raisea KeyError如果叫multipart。如果该部分是text部分和errors指定,在将有效负载解码为unicode时将其用作错误处理程序。默认错误处理程序是replace.

email.contentmanager.set_contentmsg, <“str”>, subtype=”plain”, charset=”utf-8″ cte=None, disposition=None, filename=None, cid=None, params=None, headers=None
email.contentmanager.set_contentmsg, <“bytes”>, maintype, subtype, cte=”base64″, disposition=None, filename=None, cid=None, params=None, headers=None
email.contentmanager.set_contentmsg, <“EmailMessage”>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None

将标题和有效负载添加到msg

添加Content-Type标题和maintype/subtypevalue.

  • 对于str,将MIME maintype设置为text,如果指定则将子类型设置为subtype,如果不是则将其设置为plain
  • 对于bytes,使用指定的maintypesubtype,orraise a TypeError如果没有说明的话
  • 对于EmailMessage对象,设置maintypeto message,并将子类型设置为subtype如果指定或rfc822如果不是。如果subtypepartial,引发错误(bytes对象必须使用toconstruct message/partial部分).

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

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

  • 对于str物品,如果cte未设置使用启发式来确定最紧凑的编码.
  • 对于EmailMessage,每个RFC 2046 ,如果ctequoted-printable要么 base64要求subtype rfc822,以及任何cte以外7bitsubtype external-body。对于message/rfc822, 使用 8bit如果cte未指定。FALLl其他值subtype, 使用 7bit.

注意

一个 ctebinary实际上还没有正常工作.EmailMessage对象由set_content是正确的,但BytesGenerator没有正确地将它正确化.

如果disposition设置,用它作为Content-Disposition头。如果没有指定,和filename指定,添加值为attachment的标题。如果没有指定disposition,也没有指定filename,请不要添加标题。disposition的唯一有效值是attachmentinline.

如果filename指定,使用它作为filename标题的Content-Disposition参数的值

如果指定cid,添加一个Content-ID header以cid作为其值

如果指定params,则重复其items方法并使用结果(key, value)对在Content-Type header

上设置附加参数如果headers被指定并且是一个表格的字符串列表headername: headervalueheader对象(通过name属性),将标题添加到msg.

脚注

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