email.header: Internationalized headers
email.header: Internationalized headers
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
软件包在其模块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
>>> print msg.as_string()
Subject: =?iso-8859-1?q?p=F6stal?=
请注意我们如何让主题
字段包含非ASCII字符?我们通过创建Header
实例并传入字符串编码的字符集来实现此目的。当后续Message
实例变平时,Subject
字段正确地采用RFC 2047
编码。支持MIME的邮件阅读器将使用嵌入的ISO-8859-1字符显示此头文件。
2.2.2版中的新功能。
这里是Header
课程描述:
class email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
创建一个可以包含不同字符集中的字符串的符合MIME的标头。
可选s
是初始标题值。如果None
(默认),则未设置初始标题值。您可以稍后使用append()
方法调用追加到标题。s
可能是一个字节字符串或一个Unicode字符串,但请参阅append()
文档的语义。
可选的字符集有
两个目的:它与方法的字符集
参数具有相同的含义append()
。它还为append()
忽略字符集
参数的所有后续调用设置默认字符集
。如果构造函数中没有提供charset
(缺省值),则us-ascii
字符集
既用作s
的初始字符集
又用作后续append()
调用的默认字符集
。
最大行长度可以通过maxlinelen
明确指定。为了将第一行分割为一个较短的值(为了说明没有包含在s中
的字段标题,例如Subject
),传入header_name中
字段的名称。默认maxlinelen
是76,而对于默认值HEADER_NAME
是None
,这意味着它不考虑为一个长,分割报头的第一行。
可选continuation_ws
必须是符合RFC 2822
的折叠空白,并且通常是空格或硬标签字符。这个角色将被添加到延续线。continuation_ws
默认为单个空格字符(“”)。
可选错误
直接传递给append()
方法。
append(s[, charset[, errors]])
将字符串s
附加到MIME头。
可选的字符集
,如果有的话,应该是一个Charset
实例(参见email.charset
)或字符集
的名称,它将被转换为Charset
实例。值None
(默认值)表示使用构造函数中给出的字符集
。
s
可能是一个字节字符串或一个Unicode字符串。如果它是一个字节字符串(即为isinstance(s, str)
真),则字符集
是该字节字符串的编码,UnicodeError
如果字符串不能用该字符集
解码,则会产生一个字符串。
如果s
是一个Unicode字符
串,则charset
是一个提示,指定字符
串中字符
的字符集
。在这种情况下,产生一个时RFC 2822
使用兼容的报头RFC 2047分
的规则,Unicode字符
串将使用下述顺序的字符集
编码的:us-ascii
中,字符集
提示,utf-8
。使用第一个字符集
不会激发a UnicodeError
。
可选错误
将传递给任何unicode()
或unicode.encode()
调用,并且默认为“严格”。
encode([splitchars])
将消息头编码为符合RFC的格式,可能包装长行并将非ASCII部分封装在base64或quoted-printable编码中。可选的splitchars
是一个字符串,它包含用来分隔长ASCII码的字符,粗略地支持RFC 2822
的最高级句法中断
。这不会影响RFC 2047
编码行。
本Header
类还提供了一些方法,以支持标准的运营商和内置函数。
__str__()
一个同义词Header.encode()
。有用的str(aHeader)
。
__unicode__()
内置unicode()
函数的助手。以Unicode字符串形式返回标题。
__eq__(other)
该方法允许您比较两个Header
实例是否相等。
__ne__(other)
该方法允许您比较两个Header
不平等的实例。
该email.header
模块还提供以下便利功能。
email.header.decode_header(header)
在不转换字符集的情况下解码消息标题值。标题值位于标题中
。
该函数返回一个(decoded_string, 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]]])
Header
从返回的成对序列中创建一个实例decode_header()
。
decode_header()
接受一个标题值字符串并返回一组字符串对,(decoded_string, charset)
其中charset
是字符集
的名称。
该函数使用这些序列中的一个并返回一个Header
实例。可选maxlinelen
,信头
,和continuation_ws
如在Header
构造函数。