解码UTF8电子邮件标头

时间:2020-03-06 14:38:58  来源:igfitidea点击:

我有以下形式的电子邮件主题:

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

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

=?utf-8分隔符是什么意思,如何从该字符串中提取信息?

解决方案

"编码字"令牌(根据RFC 2047)可以出现在某些标头的值中。它们的解析如下:

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

在这种情况下,字符集为UTF-8,编码为" B",表示base64(另一个选项为" Q",表示Quoted可打印)。

要读取它,请先解码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);

  
  ABSTRACT
  
  This module implements RFC 2047 Mime
  Header Encoding. There are 3 variant
  encoding names; MIME-Header, MIME-B
  and MIME-Q. The difference is
  described below
  
  

              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?....?=

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

这是RFC2047中指定的标头字符集标记的标准扩展。

我认为Encode模块使用MIME-Header编码处理该问题,因此请尝试以下操作:

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