解码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);