19.1.8. email.header:国际化标头

源代码: Lib / email / header.py

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.headeremail.charset模块中支持这些标准。

如果您要在电子邮件标头中包含非ASCII字符(例如主题字段),则应使用HeaderMessage对象中的字段分配给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。 标题 s = Nonecharset = Nonemaxlinelen = Noneheader_name = Nonecontinuation_ws =''errors ='strict'< / T9> ) T10> ¶ T11>

创建一个MIME兼容的头,可以包含不同字符集中的字符串。

可选s是初始标头值。如果None(默认值),则不设置初始标题值。您可以稍后使用append()附加到方头调用。s可能是bytesstr的实例,但请参阅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 scharset = Noneerrors ='strict' ) T5> ¶ T6>

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

可选的字符集(如果给出)应为Charset实例(请参阅email.charset)或字符集的名称,到Charset实例。None(默认值)表示使用构造函数中给出的字符集

s可以是bytesstr的实例。如果它是bytes的实例,则字符集是该字节字符串的编码,如果字符串不能为UnicodeError用该字符集解码。

如果sstr的实例,则charset是指定字符串中字符的字符集的提示。

在任一情况下,使用 RFC 2047规则生成符合RFC 2822 t>的 RFC 2822如果无法使用输出编解码器对字符串进行编码,则会引发UnicodeError。

如果s是字节字符串,则可选的错误作为errors参数传递给decode调用。

编码 splitchars =';\ t'maxlinelen =无 linesep = '\ n' T5> ) T6> ¶ T7>

将消息头编码为符合RFC的格式,可能包装长行并以base64或quoted-printable编码封装非ASCII部分。

可选的splitchars是一个包含字符的字符串,应该在正常头部包装期间通过分割算法给予额外的权重。这是非常粗糙的支持 RFC 2822更高级别的语法断点:在分割期间优先使用splitchar前面的分割点,它们在字符串中出现的顺序。空格和制表符可以包括在字符串中,以指示当其他分割字符不出现在正在分割的线中时,是否应该将偏好提供给另一个作为分割点。Splitchar不会影响 RFC 2047编码行。

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

linesep指定用于分隔折叠标题行的字符。它默认为Python应用程序代码(\n)最有用的值,但可以指定\r\n,以便生成带有符合RFC的行分隔符的标题。

在版本3.2中更改:添加了lineep参数。

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

__ STR __ T0> ( T1> ) T2> ¶ T3>

Header的近似值作为字符串返回,使用无限制的行长度。使用指定的编码将所有片段转换为Unicode,并适当地连接在一起。使用'replace'错误处理程序将任何具有'unknown-8bit'字符集的片段解码为ASCII。

在版本3.2中更改:添加了'unknown-8bit'字符集的处理。

__当量__ T0> ( T1> 其他 T2> ) T3> ¶ T4>

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

__ NE __ T0> ( T1> 其他 T2> ) T3> ¶ T4>

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

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

email.header。 T0> decode_header T1> ( T2> 头 T3> ) T4> ¶ T5 >

解码邮件标头值,而不转换字符集。标头值位于标头中。

此函数返回包含标头的每个解码部分的(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_seqmaxlinelen =无header_name = Nonecontinuation_ws =''

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

decode_header()获取标头值字符串,并返回格式(decoded_string, charset)其中字符集是字符集的名称。

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