解码UTF8电子邮件标头

时间:2008-09-24 08:45:36

标签: perl email utf-8 header

我有以下表单的电子邮件主题:

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

电子邮件的正文是utf-8 base64编码 - 并且解码得很好。 我目前正在使用Perl的Email :: MIME模块来解码电子邮件。

=?utf-8分隔符的含义是什么?如何从此字符串中提取信息?

5 个答案:

答案 0 :(得分:35)

encoded-word令牌(根据RFC 2047)可能会出现在某些标头的值中。它们的解析如下:

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

在这种情况下,Charset是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-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?....?=

答案 1 :(得分:17)

我认为Encode模块使用MIME-Header编码来处理它,所以试试这个:

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

答案 2 :(得分:3)

结帐RFC2047。 'B'表示最后两个'?'之间的部分是base64编码的。 'utf-8'自然意味着解码数据应解释为UTF-8。

答案 3 :(得分:2)

来自MIME-tools的

MIME::Words也适用于此。我遇到了Encode的一些问题,发现在一些字符串上,MIME :: Words成功了,但Encode却没有。

use MIME::Words qw(:all);
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);

答案 4 :(得分:1)

这是标题字符集标准的标准扩展,在RFC2047中指定。