解码 UTF8 电子邮件标头
Posted
技术标签:
【中文标题】解码 UTF8 电子邮件标头【英文标题】:Decode an UTF8 email header 【发布时间】:2010-09-12 16:02:45 【问题描述】:我有一个表单的电子邮件主题:
=?utf-8?B?T3.....?=
电子邮件的正文采用 utf-8 base64 编码 - 解码良好。 我目前正在使用 Perl 的 Email::MIME 模块来解码电子邮件。
=?utf-8 分隔符是什么意思,如何从这个字符串中提取信息?
【问题讨论】:
【参考方案1】:MIME::Words 来自 MIME-tools 也可以很好地解决这个问题。我在使用 Encode 时遇到了一些问题,发现 MIME::Words 在一些 Encode 没有成功的字符串上成功。
use MIME::Words qw(:all);
$decoded = decode_mimewords(
'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
【讨论】:
【参考方案2】:encoded-word
标记(根据RFC 2047)可以出现在某些标头的值中。解析如下:
=?<charset>?<encoding>?<data>?=
在这种情况下,字符集是 UTF-8,编码是 B
,意思是 base64(另一个选项是 Q
,意思是 Quoted Printable)。
要读取它,首先解码 base64,然后将其视为 UTF-8 字符。
还可以阅读各种 Internet 邮件 RFC 了解更多详细信息,主要是 RFC 2047。
由于您使用的是 Perl,Encode::MIME::Header 可能有用:
概要
use Encode qw/encode decode/; $utf8 = decode('MIME-Header', $header); $header = encode('MIME-Header', $utf8);
摘要
此模块实现 RFC 2047 Mime 标头编码。有 3 种变体 编码名称; MIME 标头,MIME-B 和 MIME-Q。不同的是 如下所述
decode() encode() MIME-Header Both B and Q =?UTF-8?B?....?= MIME-B B only; Q croaks =?UTF-8?B?....?= MIME-Q Q only; B croaks =?UTF-8?Q?....?=
【讨论】:
【参考方案3】:我认为 Encode 模块使用 MIME-Header
编码处理这个问题,所以试试这个:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
【讨论】:
这很有帮助,谢谢。顺便说一句,我还使用 print encode('utf-8', $headers_decoded) 来正确显示解码的标题,如果其他人在编写一些邮件脚本时正在阅读这个。【参考方案4】:这是标题字符集标签的标准扩展,在RFC2047 中指定。
【讨论】:
【参考方案5】:查看RFC2047。 'B' 表示最后两个 '?' 之间的部分是 base64 编码的。 'utf-8' 自然意味着解码后的数据应该被解释为 UTF-8。
【讨论】:
以上是关于解码 UTF8 电子邮件标头的主要内容,如果未能解决你的问题,请参考以下文章