:国际化标题 – 电子邮件和MIME处理包(Python教程)(参考资料)
email.header
:国际化标题
此模块是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.header
和email.charset
modules.
中支持这些标准如果你想在电子邮件标题中包含非ASCII字符,请在Subject或To字段,你应该使用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.
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()
calls最大行长可以通过maxlinelen明确指定。将第一行转换为较短的值(以考虑s中未包含的字段标题,例如Subject)在header_name。默认maxlinelen是76,是header_name是
None
,这意味着它不会被考虑在一个长的分割头的第一行.可选continuation_ws必须是 RFC 2822 – 兼容的foldwhitespace,通常是空格或硬标签字符。此字符将添加到延续行。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 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.
Header
class还提供了许多方法来支持标准操作符和内置函数.__str__
()-
回复
Header
作为字符串,使用无限的行长度。所有部分都使用指定的编码转换为unicode并适当地连接在一起。任何带有"unknown-8bit"
使用解码为ASCII"replace"
错误处理程序在版本3.2中更改:为添加处理
"unknown-8bit"
charset.
__eq__
(other)-
这个方法可以比较两个
Header
实例forequality .
__ne__
(other)-
这个方法可以比较两个
Header
forinequality .
email.header
模块还提供以下方便的功能.
email.header.
decode_header
(header)-
解码消息头值而不转换字符集。headervalue在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")]
评论被关闭。