email.header :国际化标题

源代码: Lib/email/header.py


此模块是传统模块的一部分 (Compat32 )电子邮件API。在当前的API中,头的编码和解码是由类似于API的字典透明地处理的。 EmailMessage 类。除了在旧代码中使用外,此模块还可用于需要完全控制头编码时使用的字符集的应用程序。

本节的其余文本是模块的原始文档。

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

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

如果要在电子邮件头中包含非ASCII字符,请在 SubjectTo 字段,您应该使用 Header 类并在中分配字段 Message 对象到的实例 Header 而不是使用字符串作为头值。导入 Header 类从 email.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'

注意这里我们想要的 Subject 包含非ASCII字符的字段?我们通过创建一个 Header 实例并传入字节字符串所编码的字符集。当随后的 Message 实例被展平,该 Subject 字段正确 RFC 2047 编码的。支持mime的邮件阅读器将使用嵌入的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 可能是 bytesstr ,但是看到 append() 语义文档。

可选的 charset 有两个目的:它与 charset 参数 append() 方法。它还为所有后续字符设置默认字符集 append() 省略了 charset 参数。如果 charset 未在构造函数中提供(默认),则 us-ascii 字符集同时用作 s 的初始字符集,并作为后续字符的默认值 append() 调用。

可以通过以下方式显式指定最大行长度: maxlinelen . 用于将第一行拆分为较短的值(用于说明未包含在 s ,例如 Subject )将字段的名称传入 header_name . 默认值 maxlinelen 为76,默认值为 header_nameNone ,这意味着不考虑长的拆分头段的第一行。

可选的 continuation_ws 必须是 RFC 2822 -兼容的折叠空格,通常是空格或硬制表符。此字符将在续行前面。 continuation_ws 默认为单个空格字符。

可选的 errors 直接通过 append() 方法。

append(s, charset=None, errors='strict')

附加字符串 s 到mime头。

可选的 charset 如果给出,则应为 Charset 实例(见) email.charset )或字符集的名称,将转换为 Charset 实例。一个值 None (违约)指 charset 使用构造函数中给定的。

s 可能是 bytesstr . 如果它是 bytes 然后 charset 是该字节字符串的编码,并且 UnicodeError 如果字符串不能用该字符集解码,则将引发。

如果 s 是的实例 str 然后 charset 是指定字符串中字符集的提示。

在这两种情况下,在生成 RFC 2822 -兼容头文件使用 RFC 2047 规则中,字符串将使用字符集的输出编解码器进行编码。如果无法使用输出编解码器对字符串进行编码,则将引发unicode错误。

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

encode(splitchars=';, \t', maxlinelen=None, linesep='\n')

将消息头编码为符合RFC的格式,可能会封装长行,并将非ASCII部分封装为base64或带引号的可打印编码。

可选的 splitchars 是一个包含字符的字符串,在正常的头换行过程中,拆分算法应赋予这些字符额外的权重。这是在非常粗略的支持 RFC 2822 's'higher level syntactic breaks':行拆分过程中,最好使用前面有splitchar的拆分点,字符的优先顺序与它们在字符串中的显示顺序相同。字符串中可能包含空格和制表符,以指示当其他拆分字符未出现在要拆分的行中时,是否应将一个字符优先于另一个字符作为拆分点。splitchars不影响 RFC 2047 编码线。

maxlinelen 如果给定,则覆盖实例的最大行长度值。

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

在 3.2 版更改: 增加了 linesep 参数。

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

__str__()

返回的近似值 Header 作为字符串,使用不受限制的行长度。所有部分都使用指定的编码转换为Unicode,并适当地连接在一起。有字符集的吗 'unknown-8bit' 使用 'replace' 错误处理程序。

在 3.2 版更改: 增加了对 'unknown-8bit' 字符集

__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?=')
[(b'p\xf6stal', 'iso-8859-1')]
email.header.make_header(decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')

创建一个 Header 由返回的成对序列的实例 decode_header() .

decode_header() 获取头值字符串并返回格式对的序列 (decoded_string, charset) 在哪里? charset 是字符集的名称。

此函数接受这些对序列中的一个,并返回 Header 实例。可选的 maxlinelenheader_namecontinuation_ws 就像在 Header 构造函数。