内容

名称

Encode::MIME::Header -- 非结构化电子邮件标头的 MIME 编码

概要

use Encode qw(encode decode);

my $mime_str = encode("MIME-Header", "Sample:Text \N{U+263A}");
# $mime_str is "=?UTF-8?B?U2FtcGxlOlRleHQg4pi6?="

my $mime_q_str = encode("MIME-Q", "Sample:Text \N{U+263A}");
# $mime_q_str is "=?UTF-8?Q?Sample=3AText_=E2=98=BA?="

my $str = decode("MIME-Header",
    "=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=\r\n " .
    "=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?="
);
# $str is "If you can read this you understand the example."

use Encode qw(decode :fallbacks);
use Encode::MIME::Header;
local $Encode::MIME::Header::STRICT_DECODE = 1;
my $strict_string = decode("MIME-Header", $mime_string, FB_CROAK);
# use strict decoding and croak on errors

摘要

此模块实现电子邮件标头的非结构化字段正文的 RFC 2047 MIME 编码。它还可用于 RFC 822“文本”令牌。但是,它不能直接用于带有字段名称的整个标头或结构化标头字段,如发件人、收件人、抄送、消息 ID 等。此模块支持 3 个编码名称:MIME-HeaderMIME-BMIME-Q

说明

解码方法将电子邮件头的非结构化字段主体(或 RFC 822“文本”令牌)作为其输入,并根据 RFC 2047RFC 2231 将输入字符串中的每个 MIME 编码字解码为一系列字节。随后,使用 编码模块 对每个具有相应 MIME 字符集的字节序列进行解码,最后返回一个输出字符串。输入字符串中不包含 MIME 编码字的文本部分在输出字符串中保持不变。两个连续 MIME 编码字之间的折叠换行符将被丢弃,其他换行符将保留在输出字符串中。MIME-B 可以解码 Base64 变体,MIME-Q 可以解码 Quoted-Printable 变体,MIME-Header 可以同时解码这两个变体。如果 编码模块 不支持特定的 MIME 字符集或所选变体,则将根据 CHECK 标志 执行操作(默认情况下,不会解码 MIME 编码字)。

编码方法将标量字符串作为其输入,并使用 严格 UTF-8 编码器将其编码为 UTF-8 字节。然后将一系列 UTF-8 字节编码为 MIME 编码字(MIME-HeaderMIME-B 使用 Base64 变体,而 MIME-Q 使用 Quoted-Printable 变体),其中每个 MIME 编码字限制为 75 个字符。MIME 编码字由 CRLF SPACE 分隔,并连接到一个输出字符串。输出字符串适用于电子邮件头的非结构化字段主体。

编码和解码方法在对 MIME 字符集进行编码和解码时都会传播 CHECK 标志

BUG

2.22 之前的版本(Encode 2.83 的一部分)具有故障的解码器和编码器。MIME 编码器在连续的 MIME 编码字之间插入了额外的空格或丢弃了空格,这导致此模块生成的 MIME 头无效。MIME 解码器倾向于丢弃空格,错误地解释数据或尝试将 Base64 MIME 编码字解码为 Quoted-Printable。这些问题已在 2.22 版本中修复。强烈建议不要使用 2.22 之前的任何版本!

2.24 之前的版本(Encode 2.87 的一部分)忽略了 CHECK 标志。MIME 编码器对输入 Unicode 字符串使用了 非严格 utf8 编码器,这可能导致无效的 UTF-8 序列。MIME 解码器也使用了 非严格 utf8 解码器,并另外使用 Encode::FB_PERLQQ 标志调用解码方法(因此用户指定的 CHECK 标志 被忽略)。此外,当 MIME 编码字包含未知编码时,它会自动发出 croak。从 2.24 版本开始,此模块使用 严格 UTF-8 编码器和解码器。并且 CHECK 标志 被正确传播。

从 2.22 版本(Encode 2.83 的一部分)开始,MIME 编码器应完全符合 RFC 2047RFC 2231。由于 MIME 编码器以前版本中上述错误,MIME 解码器有一个默认使用的不太严格的兼容模式。它应该能够解码此模块的 2.22 之前版本编码的 MIME 编码字。但是,请注意,根据 RFC 2047,这是不正确的。

在默认非严格模式下,MIME 解码器尝试解码看起来像 MIME 编码单词的每个子字符串。因此,MIME 编码单词不需要用空格分隔。要强制执行正确的严格模式,请将变量 $Encode::MIME::Header::STRICT_DECODE 设置为 1,例如通过本地化

use Encode::MIME::Header;
local $Encode::MIME::Header::STRICT_DECODE = 1;

作者

Pali <[email protected]>

另请参阅

EncodeRFC 822RFC 2047RFC 2231