18.1.5. email.header:国际化的头文件 — Python 文档

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

18.1.5. 邮件头 : 国际化的标题

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

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

如果您想在电子邮件标题中包含非 ASCII 字符,例如在 SubjectTo 字段中,您应该使用 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
>>> print msg.as_string()
Subject: =?iso-8859-1?q?p=F6stal?=

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

2.2.2 版中的新功能。


这里是 Header 类描述:

class email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])

创建一个符合 MIME 标准的标头,该标头可以包含不同字符集中的字符串。

可选的 s 是初始标头值。 如果 None(默认),则不设置初始标头值。 您可以稍后使用 append() 方法调用附加到标头。 s 可以是字节字符串或 Unicode 字符串,但请参阅 append() 文档以了解语义。

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

最大行长度可以通过 maxlinelen 明确指定。 用于将第一行拆分为较短的值(以说明 s 中未包含的字段标题,例如 Subject) 传入 header_name 中的字段名称。 默认的 maxlinelen 是 76,而 header_name 的默认值是 None,这意味着它不会被考虑到一个长分割头的第一行。

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

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

append(s[, charset[, errors]])

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

可选的 charset,如果给定,应该是 Charset 实例(参见 email.charset)或字符集的名称,它将被转换为 [ X165X]字符集实例。 None(默认值)的值意味着使用构造函数中给出的 charset

s 可以是字节串或 Unicode 串。 如果是字节串(即 isinstance(s, str) 为真),则 charset 是该字节字符串的编码,如果该字符串无法使用该字符集解码,则会引发 UnicodeError

如果 s 是 Unicode 字符串,则 charset 是指定字符串中字符的字符集的提示。 在这种情况下,当使用 RFC 2047 规则生成符合 RFC 2822 的标头时,Unicode 字符串将使用以下编码字符集顺序:us-ascii字符集 提示、utf-8。 使用第一个不引起 UnicodeError 的字符集。

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

encode([splitchars])

将消息头编码为符合 RFC 的格式,可能会包装长行并将非 ASCII 部分封装在 base64 或带引号的可打印编码中。 可选的 splitchars 是一个包含用于分割长 ASCII 行的字符的字符串,粗略地支持 RFC 2822最高级别的语法中断 . 这不会影响 RFC 2047 编码的行。

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

__str__()

Header.encode() 的同义词。 对 str(aHeader) 有用。

__unicode__()

内置 unicode() 函数的助手。 以 Unicode 字符串形式返回标头。

__eq__(other)

此方法允许您比较两个 Header 实例是否相等。

__ne__(other)

此方法允许您比较两个 Header 实例的不等式。

email.header 模块还提供了以下方便的功能。

email.header.decode_header(header)

解码消息头值而不转换字符集。 标头值在 header 中。

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

下面是一个例子:

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

decode_header() 返回的对序列创建 Header 实例。

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

此函数采用这些对序列之一并返回 Header 实例。 可选的 maxlinelenheader_namecontinuation_wsHeader 构造函数中的一样。