19.1.8. email.header
:国际化标头¶
RFC 2822是描述电子邮件格式的基本标准。它源于早期的 RFC 822标准,该标准在大多数电子邮件仅由ASCII字符组成时广泛使用。 RFC 2822是假定电子邮件仅包含7位ASCII字符的规范。
当然,随着电子邮件已经在全世界部署,它已经变得国际化,使得现在可以在电子邮件消息中使用特定于语言的字符集。基本标准仍然需要使用仅7位ASCII字符传输电子邮件消息,因此编写了一系列RFC,描述如何将包含非ASCII字符的电子邮件编码为 RFC 2822These RFCs include RFC 2045, RFC 2046, RFC 2047, and RFC 2231. email
包在其email.header
和email.charset
模块中支持这些标准。
如果您要在电子邮件标头中包含非ASCII字符(例如主题或至字段),则应使用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'
注意这里我们如何要主题字段包含非ASCII字符?我们通过创建一个Header
实例,并传入字节字符串编码的字符集。当后续的Message
实例展开时,主题字段正确地 RFC 2047MIME感知邮件阅读器将使用嵌入的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()
语义的文档。可选字符集有两个用途:它与
append()
方法的charset参数含义相同。它还为省略字符集参数的所有后续append()
调用设置默认字符集。如果构造函数(默认值)中未提供字符集,则us-ascii
字符集同时用作s的初始字符集和作为后续append()
调用的默认值。最大行长度可以通过maxlinelen明确指定。为了将第一行分割为较短的值(以考虑不包括在s中的字段报头,例如,主题)传递header_name中的字段名称。默认的maxlinelen是76,header_name的默认值是
None
,意味着它不会被考虑为长线的第一行,拆分头。可选continuation_ws必须是 RFC 2822的折叠空格,通常是空格或硬标签字符。此字符将添加到连续行。continuation_ws默认为单个空格字符。
可选的错误直接传递到
append()
方法。-
append
(s, charset=None, errors='strict')¶ 将字符串s附加到MIME标头。
可选的字符集(如果给出)应为
Charset
实例(请参阅email.charset
)或字符集的名称,到Charset
实例。值None
(默认值)表示使用构造函数中给出的字符集。s可以是
bytes
或str
的实例。如果它是bytes
的实例,则字符集是该字节字符串的编码,如果字符串不能为UnicodeError
用该字符集解码。如果s是
str
的实例,则charset是指定字符串中字符的字符集的提示。在任一情况下,使用 RFC 2047规则生成符合RFC 2822 t>的 RFC 2822如果无法使用输出编解码器对字符串进行编码,则会引发UnicodeError。
如果s是字节字符串,则可选的错误作为errors参数传递给decode调用。
-
encode
(splitchars=';, \t', maxlinelen=None, linesep='\n')¶ 将消息头编码为符合RFC的格式,可能包装长行并以base64或quoted-printable编码封装非ASCII部分。
可选的splitchars是一个包含字符的字符串,应该在正常头部包装期间通过分割算法给予额外的权重。这是非常粗糙的支持 RFC 2822更高级别的语法断点:在分割期间优先使用splitchar前面的分割点,它们在字符串中出现的顺序。空格和制表符可以包括在字符串中,以指示当其他分割字符不出现在正在分割的线中时,是否应该将偏好提供给另一个作为分割点。Splitchar不会影响 RFC 2047编码行。
maxlinelen(如果给出)将覆盖实例的最大行长度值。
linesep指定用于分隔折叠标题行的字符。它默认为Python应用程序代码(
\n
)最有用的值,但可以指定\r\n
,以便生成带有符合RFC的行分隔符的标题。在版本3.2中更改:添加了lineep参数。
Header
类还提供了许多方法来支持标准运算符和内建函数。-
email.header
模块还提供了以下方便的功能。
-
email.header.
decode_header
(header)¶ 解码邮件标头值,而不转换字符集。标头值位于标头中。
此函数返回包含标头的每个解码部分的
(decoded_string, 字符集)
的列表。字符集为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)
其中字符集是字符集的名称。此函数采用这些对中的一个序列,并返回
Header
实例。可选maxlinelen,header_name和continuation_ws与Header
构造函数中的一样。