email.header: 国际化标头¶

�代�: Lib/email/header.py


此模�是旧� (Compat32) email API 的一部分。 在当�的 API 中标头的编�和解�是由 EmailMessage 类的字典型 API ��明地处�的。 除了在旧有代�中使用,此模�在需�完全控制当编�标头时所使用的字符集时也很有用处。

本节中的其余文本是此模�的原始文档。

RFC 2822 是�述电�邮件消�格�的基础标准。 它派生自更早的 RFC 822 标准,该标准在大多数电�邮件仅由 ASCII 字符组�时已被广泛使用。 RFC 2822 所�述的规范�定电�邮件都�包� 7 � ASCII 字符。

当然,��电�邮件在全�部署,它已��得国际化了,例如电�邮件消�中现在�以使用特定语言的专属字符集。 这个基础标准�然�求电�邮件消��使用 7 � ASCII 字符�进行传输,为此编写了大� RFC ��述如何将包�� ASCII 字符的电�邮件编�为符� RFC 2822 的格�。 这些 RFC 包括 RFC 2045, RFC 2046, RFC 2047 和 RFC 2231。 email 包在其 email.header 和 email.charset 模�中支�了这些标准。

如果你想在你的电�邮件标头中包括� ASCII 字符,比如说是在 Subject 或 To 字段中,你应当使用 Header 类并将 Message 对象中的字段赋值为 Header 的实例而�是使用字符串作为字段值。 请从 email.header 模�导入 Header 类。 例如:

>>> from email.message import Message
>>> from email.header import Header
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
>>> msg.as_string()
'Subject: =?iso-8859-1?q?p=F6stal?=\n\n'

是�注�到这里我们是如何希望 Subject 字段包�� ASCII 字符的? 我们通过创建一个 Header 实例并传入字节串编�所用的字符集��到这一点。 当�续的 Message 实例被展平时,Subject 字段会正确地按 RFC 2047 �编�。 �感知 MIME 的电�邮件阅读器将会使用嵌入的 ISO-8859-1 字符�显示此标头。

以下是 Header 类�述:

class email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')¶

创建符� MIME �求的标头,其中�包���字符集的字符串。

�选的 s 是�始标头值。 如果为 None (默认值),则表示�始标头值未设置。 你�以在��使用 append() 方法调用�标头添加新值。 s �以是 bytes 或 str 的实例,注��阅 append() 文档了解相关语义。

�选的 charset 用于两�目的:它的�义与 append() 方法的 charset �数相�。 它还会为所有�略了 charset �数的�续 append() 调用设置默认字符集。 如果 charset 在构造器中未�供(默认设置),则会将 us-ascii 字符集用作 s 的�始字符集以��续 append() 调用的默认字符集。

通过 maxlinelen �以显�指定最大行长度。 �将第一行拆分为更短的值 (以适应未被包括在to account for the field header which isn't included in s 中的字段标头,例如 Subject),则将字段�称作为 header_name 传入。 maxlinelen 默认值为 76,而 header_name 默认值为 None,表示�考虑拆分超长标头的第一行。

�选的 continuation_ws 必须为符� RFC 2822 的折�用空白符,通常是空格符或硬制表符。 这个字符将被加缀至连续行的开头。 continuation_ws 默认为一个空格符。

�选的 errors 会被直接传递给 append() 方法。

append(s, charset=None, errors='strict')¶

将字符串 s 添加到 MIME 标头。

如果给出�选的 charset,它应当是一个 Charset 实例 (�� email.charset) 或字符集�称,该�数将被转�为一个 Charset 实例。 如果为 None (默认值) 则表示会使用构造器中给出的 charset。

s �以是 bytes 或 str 的实例。 如果它是 bytes 的实例,则 charset 为该字节串的编�格�,如果字节串无法用该字符集�解�则将引� UnicodeError。

如果 s 是 str 的实例,则 charset 是用�指定字符串中字符字符集的�示。

在这两�情况下,当使用 RFC 2047 规则产生符� RFC 2822 的标头时,将使用指定字符集的输出编解�器�编�字符串。 如果字符串无法使用该输出编解�器�编�,则将引� UnicodeError。

�选的 errors 会在 s 为字节串时被作为 errors �数传递给 decode 调用。

encode(splitchars=';, \t', maxlinelen=None, linesep='\n')¶

将消�标头编�为符� RFC 的格�,�能会对过长的行采�折行并将� ASCII 部分以 base64 或 quoted-printable 编�格�进行�装。

�选的 splitchars 是一个字符串,其中包�应在正常的标头折行处�期间由拆分算法赋予�外��的字符。 这是对于 RFC 2822 中 '更高层级语法拆分' 的很粗略的支�:在拆分期间会首选在 splitchar 之�的拆分点,字符的优先级是基于它们在字符串中的出现顺�。 字符串中�包�空格和制表符以指明当其他拆分字符未在被拆分行中出现时是��将�个字符作为优先于�一个字符的首选拆分点。 拆分字符�会影�以 RFC 2047 编�的行。

如果给出 maxlinelen,它将覆盖实例的最大行长度值。

linesep 指定用�分隔已折�标头行的字符。 它默认为 Python 应用程�代�中最常用的值 (\n),但也�以指定为 \r\n 以便产生带有符� RFC 的行分隔符的标头。

在 3.2 版本�生�更: 增加了 linesep �数。

Header 类还�供了一些方法以支�标准�算符和内置函数。

__str__()¶

以字符串形�返回 Header 的近似表示,使用���制的行长度。 所有部分都会使用指定编�格�转�为 unicode 并适当地连接起�。 任何带有 'unknown-8bit' 字符集的部分都会使用 'replace' 错误处�程�解�为 ASCII。

在 3.2 版本�生�更: 增加对 'unknown-8bit' 字符集的处�。

__eq__(other)¶

这个方法�许你对两个 Header 实例进行相等比较。

__ne__(other)¶

这个方法�许你对两个 Header 实例进行�等比较。

email.header 模�还�供了下列便�函数。

email.header.decode_header(header)¶

在�转�字符集的情况下对消�标头值进行解�。 header 为标头值。

这个函数返回一个 (decoded_string, charset) 对的列表,其中包�标头的�个已解�部分。 对于标头的未编�部分 charset 为 None,在其他情况下则为一个包�已编�字符串中所指定字符集�称的�写字符串。

以下是为示例代�:

>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[(b'p\xf6stal', 'iso-8859-1')]
email.header.make_header(decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')¶

基于 decode_header() 所返回的数�对�列创建一个 Header 实例。

decode_header() 接�一个标头值字符串并返回格�为 (decoded_string, charset) 的数�对�列,其中 charset 是字符集�称。

这个函数接�这样的数�对�列并返回一个 Header 实例。 �选的 maxlinelen, header_name 和 continuation_ws 与 Header 构造器中的�义相�。