email.header:国际化标题

源代码: Lib / email / header.py


此模块是legacy(Compat32电子邮件API的一部分。在当前的API中,头部的编码和解码由EmailMessage类的类似字典的API透明地处理。除了在遗留代码中使用之外,此模块在完全控制编码标题时使用的字符集的应用程序中非常有用.

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

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.headeremail.charset modules.

中支持这些标准如果你想在电子邮件标题中包含非ASCII字符,请在SubjectTo字段,你应该使用Header类并将Message对象中的字段分配给Header实例为headervalue使用字符串。从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.Headers=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()calls

最大行长可以通过maxlinelen明确指定。将第一行转换为较短的值(以考虑s中未包含的字段标题,例如Subject)在header_name。默认maxlinelen是76,是header_nameNone,这意味着它不会被考虑在一个长的分割头的第一行.

可选continuation_ws必须是 RFC 2822 – 兼容的foldwhitespace,通常是空格或硬标签字符。此字符将添加到延续行。continuation_ws默认为单个空格字符.

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

appends, charset=None, errors=”strict”

附加字符串s到MIME标题.

可选的 charset如果给定,应该是Charset实例(参见email.charset)或字符集的名称,它将被转换为Charset实例。值None(默认值)表示charset在构造函数中使用.

s可能是bytesstr的一个例子。如果它是bytes的实例,则charset是该字节串的编码,并且UnicodeError如果字符串不能用该字符集解码,则会被提升.

如果sstr的一个实例,那么charset是一个指示字符集的提示字符串中的字符

无论哪种情况,使用 RFC 2047 生成 RFC 2822 规则,字符串将使用字符集的输出编解码器进行编码。如果无法使用输出编解码器对字符串进行编码,则会引发aUnicodeError。

可选errors作为errors参数传递给解码callif s是一个字节串.

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

将邮件头编码为符合RFC的格式,可能包裹长行并封装base64中的非ASCII部分或quoted-printableencodings.

可选splitchars是一个包含字符的字符串,在正常的headerwrapping期间,它应该通过分割算法获得额外的权重。这是对 RFC 2822的非常粗略的支持”更高级别的句法中断’:在分割前最好使用splitchar前面的分割点,首选字符在它们出现在字符串中的顺序。空格和制表符可以包含在字符串中,以指示当其他分割字符未出现在换行符分割中时,是否应将首选项作为分割点给予优先选项。拆分器不影响RFC 2047 编码的行

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

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

在版本3.2中更改:添加了linesepargument.

Headerclass还提供了许多方法来支持标准操作符和内置函数.

__str__ ()

回复Header作为字符串,使用无限的行长度。所有部分都使用指定的编码转换为unicode并适当地连接在一起。任何带有"unknown-8bit"使用解码为ASCII"replace"错误处理程序

在版本3.2中更改:为添加处理"unknown-8bit"charset.

__eq__other

这个方法可以比较两个Header实例forequality .

__ne__other

这个方法可以比较两个Headerforinequality .

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

email.header.decode_headerheader

解码消息头值而不转换字符集。headervalue在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_headerdecoded_seq, maxlinelen=None, header_name=None, continuation_ws=” “

Header返回的一对对象中创建一个decode_header().

decode_header()实例,取一个标题值字符串并返回一对格式为(decoded_string, charset)的对,其中charset字符集的名称.

该函数采用其中一对序列并返回Header实例。可选maxlinelen, header_namecontinuation_wsHeader构造函数中所述

评论被关闭。