解码UTF8电子邮件标题

25

我有一个邮件主题的形式:

=?utf-8?B?T3.....?=

邮件正文是utf-8 base64编码的,解码工作顺利完成。我目前使用Perl的Email::MIME模块来解码该电子邮件。

?utf-8分隔符的含义是什么?我该如何从这个字符串中提取信息?

5个回答

40

根据RFC 2047,一些标题的值中可能会出现encoded-word标记。它们的解析如下:

=?<charset>?<encoding>?<data>?=

在这种情况下,字符集为UTF-8,编码是B,意味着使用base64(另一个选项是Q,意味着Quoted Printable)。

要阅读它,首先解码base64,然后把它当作UTF-8字符处理。

此外,可以阅读各种Internet Mail RFC获取更多详细信息,主要是RFC 2047

由于您正在使用Perl,可能会用到Encode::MIME::Header

SYNOPSIS

use Encode qw/encode decode/;
$utf8   = decode('MIME-Header', $header);
$header = encode('MIME-Header', $utf8);

摘要

本模块实现RFC 2047 Mime头编码。有3种变体编码名称:MIME-Header, 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?....?=

17

我认为Encode模块使用编码处理这个问题,所以尝试这样做:

use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);

1
那很有帮助,谢谢。顺便说一句,我还使用了print encode('utf-8', $headers_decoded)来正确显示解码后的标题,如果其他人在编写邮件脚本时阅读此内容。 - kagali-san

3

请查看RFC2047。'B'表示最后两个问号之间的部分是base64编码的。'utf-8'自然表示解码后的数据应该被解释为UTF-8。


2
MIME-tools中的MIME::Words也很适合这个任务。我遇到了一些Encode的问题,但发现在某些字符串上MIME::Words成功了。
use MIME::Words qw(:all);
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);

1

这是一个标准的扩展,用于标记头部字符集,规定在RFC2047中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接