首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

email.header: Internationalized headers

RFC 2822是描述电子邮件格式的基本标准。它来自早期的 RFC 822标准,该标准在大多数电子邮件仅由ASCII字符组成的时候被广泛使用。RFC 2822是一个规范,其中假定电子邮件仅包含7位ASCII字符。

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

如果要在电子邮件标题中包含非ASCII字符,请在SubjectTo字段中说明,应该使用Header该类并将Message对象中的字段分配给实例,Header而不是使用字符串作为标题值。Headeremail.header模块导入类。例如:

代码语言:javascript
复制
>>> 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_NAMENone,这意味着它不考虑为一个长,分割报头的第一行。

可选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用于报头的非编码的部分,否则包含已编码的字符串中指定的字符集的名称的小写字符串。

这是一个例子:

代码语言:javascript
复制
>>> 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构造函数。

扫码关注腾讯云开发者

领取腾讯云代金券