On this page
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 2231。 email软件包的email.header和email.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类的描述:
-
- class *
email.header.
Header
([* s * [,* charset * [,* maxlinelen * [,* header_name * [,* continuation_ws * [,* errors *]]]]]]]]))
- 创建一个 MIME 兼容的 Headers,其中可以包含不同字符集的字符串。
- class *
可选* 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()方法。
append
(* s * [,字符集 [,错误]])- 将字符串* s *附加到 MIMEHeaders。
可选的* charset (如果提供)应该是Charset实例(请参见email.charset)或字符集的名称,它将转换为Charset实例。值None
(默认值)表示使用了构造函数中指定的 charset *。
- s 可以是字节字符串或 Unicode 字符串。如果它是一个字节字符串(即
isinstance(s, str)
为 true),则 charset *是该字节字符串的编码,如果无法使用该字符集对该字符串进行解码,则将引发UnicodeError。
如果* s 是 Unicode 字符串,则 charset 是一个提示,用于指定字符串中字符的字符集。在这种情况下,当使用 RFC 2047规则生成 RFC 2822兼容的 Headers 时,将使用以下字符集按 Sequences 对 Unicode 字符串进行编码:us-ascii
, charset *提示utf-8
。使用不引起UnicodeError的第一个字符集。
可选的* errors *传递给任何unicode()或unicode.encode()
调用,默认为“ strict”。
encode
([[splitchars *])
Header类还提供了许多支持标准运算符和内置函数的方法。
__str__
( )- Header.encode()的同义词。对
str(aHeader)
有用。
- Header.encode()的同义词。对
__unicode__
( )- 内置unicode()函数的帮助器。返回 Headers 为 Unicode 字符串。
__eq__
(其他)- 此方法使您可以比较两个Header实例的相等性。
__ne__
(其他)- 此方法使您可以比较两个Header实例的不平等性。
email.header模块还提供以下便捷Function。
email.header.
decode_header
(* header *)- 解码消息头值,而不转换字符集。Headers 值在* header *中。
此函数返回一个(decoded_string, charset)
对的列表,其中包含头的每个解码部分。 * charset *对于标题的未编码部分为None
,否则为小写字符串,其中包含在编码字符串中指定的字符集的名称。
这是一个例子:
>>> 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()接收 Headers 值字符串,并返回一系列格式为(decoded_string, charset)
的对,其中* charset *是字符集的名称。
此函数采用这些对中的一个序列并返回Header实例。可选的* maxlinelen , header_name 和 continuation_ws *与Header构造函数相同。