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 2045 , RFC 2046 , RFC 2047 和 RFC 2231 . 这个 email
软件包在ITS中支持这些标准 email.header
和 email.charset
模块。
如果要在电子邮件头中包含非ASCII字符,请在 Subject 或 To 字段,您应该使用 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 可能是bytes
或str
,但是看到append()
语义文档。可选的 charset 有两个目的:它与 charset 参数
append()
方法。它还为所有后续字符设置默认字符集append()
省略了 charset 参数。如果 charset 未在构造函数中提供(默认),则us-ascii
字符集同时用作 s 的初始字符集,并作为后续字符的默认值append()
调用。可以通过以下方式显式指定最大行长度: maxlinelen . 用于将第一行拆分为较短的值(用于说明未包含在 s ,例如 Subject )将字段的名称传入 header_name . 默认值 maxlinelen 为76,默认值为 header_name 是
None
,这意味着不考虑长的拆分头段的第一行。可选的 continuation_ws 必须是 RFC 2822 -兼容的折叠空格,通常是空格或硬制表符。此字符将在续行前面。 continuation_ws 默认为单个空格字符。
可选的 errors 直接通过
append()
方法。- append(s, charset=None, errors='strict')¶
附加字符串 s 到mime头。
可选的 charset 如果给出,则应为
Charset
实例(见)email.charset
)或字符集的名称,将转换为Charset
实例。一个值None
(违约)指 charset 使用构造函数中给定的。s 可能是
bytes
或str
. 如果它是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
类还提供了许多方法来支持标准运算符和内置函数。
这个 email.header
模块还提供以下方便的功能。
- email.header.decode_header(header)¶
解码消息头值而不转换字符集。头值在 header.
此函数返回
(decoded_string, charset)
包含头的每个解码部分的对。 charset 是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=' ')¶
创建一个
Header
由返回的成对序列的实例decode_header()
.decode_header()
获取头值字符串并返回格式对的序列(decoded_string, charset)
在哪里? charset 是字符集的名称。此函数接受这些对序列中的一个,并返回
Header
实例。可选的 maxlinelen , header_name 和 continuation_ws 就像在Header
构造函数。