25

我有一个表单的电子邮件主题:

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

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

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

4

5 回答 5

40

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

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

在这种情况下,字符集是 UTF-8,编码是Bbase64(另一个选项是QQuoted 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 Header Encoding。有 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?....?=
于 2008-09-24T08:51:41.087 回答
17

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

use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
于 2008-09-24T08:57:18.453 回答
3

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

于 2008-09-24T08:55:50.203 回答
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>',
);
于 2014-02-21T02:07:15.890 回答
1

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

于 2008-09-24T08:55:55.430 回答