用于python2.7或python3的Python电子邮件头解码器在编码和未编码文本之间切换时似乎有一些奇怪的行为。
from email.header import decode_header
print decode_header("=?ISO-8859-1?B?QA==?=example.com");
print decode_header("=?ISO-8859-1?B?QA==?= example.com");
print decode_header("=?ISO-8859-1?Q?=40example?= .com");
print decode_header("=?ISO-8859-1?Q?=40example?=.com");
这是结果
[('=?ISO-8859-1?B?QA==?=example.com', None)]
[('@', 'iso-8859-1'), ('example.com', None)]
[('@example', 'iso-8859-1'), ('.com', None)]
[('=?ISO-8859-1?Q?=40example?=.com', None)]
在所有示例输入中,编码文本只是@符号,它应该被正确解释,但它不会。我认为RFC 1342的解释对我来说似乎不对。 Python期望空格或换行符是编码文本的结尾。我没有在RFC中看到这一点,RFC只表示我读取它时多个编码文本之间需要空间,而不是文本的编码文本和未编码部分之间。因此,无论何时看到“?=”,您都需要将其视为python不执行的编码文本的结尾。我想问问专家这是一个错误,或者如果我弄错了?
维杰
RFC 2047定义了3个可能出现“编码字”的位置。它几乎在所有情况下都需要分隔空格,即使在“编码字”和未编码文本之间也是如此,大多数不需要分隔空格的情况似乎都是错误。文本看起来像这样(没有应用errata,并且手动调整了格式):
根据以下规则,“编码字”可能出现在邮件标题或正文部分标题中:
- “编码字”可以替换任何“主题”或“注释”标题字段中的“文本”标记(由RFC 822定义),任何扩展消息标题字段或字段正文定义为“*”的任何MIME正文部分字段文本'。 “编码字”也可以出现在任何用户定义的(“X-”)消息或正文部分标题字段中。 普通的ASCII文本和“编码字”可以一起出现在同一个标题字段中。但是,出现在定义为“* text”的标题字段中的“编码字”必须通过“linear-white-space”与任何相邻的“编码字”或“文本”分开。
- “编码字”可以出现在由“(”和“)”分隔的“注释”内,即,只要允许“ctext”。更确切地说,RFC 822 ABNF对“评论”的定义修改如下:
comment = "(" *(ctext / quoted-pair / comment / encoded-word) ")"
出现在'注释'中的“Q”编码'编码字'必须不包含出现在'注释'中的字符“(”,“)”或“'encoded-word'必须与任何相邻的字符分开'coded-word'或'ctext'由'linear-white-space'。 值得注意的是,“评论”只能在“结构化”字段正文中识别。在其主体定义为“* text”的字段中,“(”和“)”被视为普通字符而不是注释分隔符,本节的规则(1)适用。 (参见RFC 822,第3.1.2和3.1.3节)- 作为“短语”中“单词”实体的替代,例如,在“发件人”,“收件人”或“抄送”标题中的地址之前。因此,来自RFC 822的“短语”的ABNF定义变为:
phrase = 1*( encoded-word / word )
在这种情况下,可以在“Q”编码的“编码字”中使用的字符集限制为:<upper and lower case ASCII letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_" (underscore, ASCII 95.)>
。出现在“短语”中的“编码字”必须与“线性白色空间”之间的任何相邻“单词”,“文本”或“特殊”分开。
这是来自RFC1342的第6页:
编码字可以与普通的“字”,“文本”或“ctext”区分开,如下所示:编码字以“=?”开头,以“?=”结尾,恰好包含4个“?”。字符包括分隔符,后跟空格或换行符。如果“word”,“text”或“ctext”不符合上述测试,则应显示在消息标题中。
因此编码后的文本需要空格或换行符。
来自同一RFC的编码头的示例:
From: =?US-ASCII?Q?Keith_Moore?= <[email protected]> To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <[email protected]> CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard <[email protected]> Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=