解码 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 电子邮件标头的主要内容,如果未能解决你的问题,请参考以下文章

是否可以解码邮件标头中的 SPAMCAUSE 字段?

如何在 PHP 中使用其编码类型解码邮件标头字符串

解码传入电子邮件主题的正确方法(utf 8)

解析电子邮件主题标头

Domino 10 有时不会在 Java 下解码 MIME 标头

无法在python中使用MIME发送带有pdf附件的电子邮件