18.1.5. email.header:国际化标题

RFC 2822是描述电子邮件格式的基本标准。它源自较旧的 RFC 822标准,该标准在大多数电子邮件仅由 ASCII 字符组成的时候被广泛使用。 RFC 2822是假设电子邮件仅包含 7 位 ASCII 字符而编写的规范。

当然,随着电子邮件在 Global 范围内的部署,它已经国际化,因此特定于语言的字符集现在可以在电子邮件中使用。基本标准仍然要求仅使用 7 位 ASCII 字符传输电子邮件,因此编写了一系列 RFC,描述了如何将包含非 ASCII 字符的电子邮件编码为 RFC 2822兼容格式。这些 RFC 包括 RFC 2045 RFC 2046 RFC 2047 RFC 2231email软件包的email.headeremail.charset模块支持这些标准。

如果要在电子邮件标题中包含非 ASCII 字符,例如在* Subject To *字段中,则应使用Header类并将Message对象中的字段分配给Header的实例,而不要使用字符串 Headers 值。从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
>>> print msg.as_string()
Subject: =?iso-8859-1?q?p=F6stal?=

注意这里我们是如何希望* Subject 字段包含非 ASCII 字符的?为此,我们创建了一个Header实例,并传入了用于编码字节字符串的字符集。当对随后的Message实例进行展平时, Subject *字段已正确进行 RFC 2047编码。支持 MIME 的邮件阅读器将使用嵌入式 ISO-8859-1 字符显示此 Headers。

版本 2.2.2 中的新Function。

这是Header类的描述:

可选* s *是初始 Headers 值。如果为None(默认值),则不设置初始 Headers 值。您以后可以使用append()方法调用将其追加到标题中。 * s *可以是字节字符串或 Unicode 字符串,但是有关语义请参见append()文档。

可选的* charset 有两个用途:它与append()方法的 charset 参数具有相同的含义。它还为所有Ellipsis charset 参数的后续append()调用设置默认字符集。如果构造函数中未提供 charset (默认值),则us-ascii字符集既用作 s *的初始字符集,又用作后续append()调用的默认字符集。

最大行长可以pass* maxlinelen 明确指定。为了将第一行拆分为较短的值(以说明 s 中未包含的字段标题,例如 Subject ),请在 header_name *中传递字段名称。 * maxlinelen 的默认值为 76,而 header_name *的默认值为None,这意味着较长的拆分标题的第一行未将其考虑在内。

可选* continuation_ws *必须是 RFC 2822兼容的折叠空白,并且通常是空格或硬制表符。该字符将添加到续行之前。 * continuation_ws *默认为单个空格字符(“”)。

可选的* errors *直接传递给append()方法。

可选的* charset (如果提供)应该是Charset实例(请参见email.charset)或字符集的名称,它将转换为Charset实例。值None(默认值)表示使用了构造函数中指定的 charset *。

如果* s 是 Unicode 字符串,则 charset 是一个提示,用于指定字符串中字符的字符集。在这种情况下,当使用 RFC 2047规则生成 RFC 2822兼容的 Headers 时,将使用以下字符集按 Sequences 对 Unicode 字符串进行编码:us-ascii charset *提示utf-8。使用不引起UnicodeError的第一个字符集。

可选的* errors *传递给任何unicode()unicode.encode()调用,默认为“ strict”。

Header类还提供了许多支持标准运算符和内置函数的方法。

email.header模块还提供以下便捷Function。

此函数返回一个(decoded_string, charset)对的列表,其中包含头的每个解码部分。 * charset *对于标题的未编码部分为None,否则为小写字符串,其中包含在编码字符串中指定的字符集的名称。

这是一个例子:

>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[('p\xf6stal', 'iso-8859-1')]

decode_header()接收 Headers 值字符串,并返回一系列格式为(decoded_string, charset)的对,其中* charset *是字符集的名称。

此函数采用这些对中的一个序列并返回Header实例。可选的* maxlinelen header_name continuation_ws *与Header构造函数相同。

首页