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 的「文字」權杖。不過,它無法直接用於包含欄位名稱的完整標頭,或結構化標頭欄位,例如寄件者、收件者、副本收件者、訊息識別碼等。此模組支援 3 種編碼名稱:MIME-Header
、MIME-B
和 MIME-Q
。
解碼方法會將電子郵件標頭的非結構化欄位主體 (或 RFC 822 的「文字」權杖) 作為輸入,並根據 RFC 2047 和 RFC 2231 將輸入字串中的每個 MIME 編碼字詞解碼為一連串位元組。接著,會使用 Encode 模組 解碼每個具有對應 MIME 字元集的位元組序列,最後傳回一個輸出字串。輸入字串中不包含 MIME 編碼字詞的文字部分會保留在輸出字串中,不會修改。兩個連續 MIME 編碼字詞之間的換行會被捨棄,其他換行則會保留在輸出字串中。MIME-B
可以解碼 Base64 變體,MIME-Q
可以解碼 Quoted-Printable 變體,MIME-Header
則可以解碼這兩種變體。如果 Encode 模組 不支援特定的 MIME 字元集或所選變體,則會根據 CHECK 旗標 執行動作 (預設情況下,不會解碼 MIME 編碼字詞)。
編碼方法將一個純量字串作為其輸入,並使用 嚴格的 UTF-8 編碼器將其編碼為 UTF-8 位元組。然後將 UTF-8 位元組序列編碼為 MIME 編碼字詞 (MIME-Header
和 MIME-B
使用 Base64 變體,而 MIME-Q
使用 Quoted-Printable 變體),其中每個 MIME 編碼字詞限制為 75 個字元。MIME 編碼字詞以 CRLF SPACE
分隔,並加入一個輸出字串。輸出字串適用於電子郵件標頭的非結構化欄位主體。
編碼和解碼方法在編碼和解碼 MIME 字元集時都會傳播 檢查旗標。
2.22 之前的版本 (Encode 2.83 的一部分) 有故障的解碼器和編碼器。MIME 編碼器會在連續的 MIME 編碼字詞之間插入額外的空格或捨棄空白,這導致此模組產生的 MIME 標頭無效。MIME 解碼器有捨棄空白、錯誤解譯資料或嘗試將 Base64 MIME 編碼字詞解碼為 Quoted-Printable 的傾向。這些問題已在 2.22 版中修復。強烈建議不要使用 2.22 之前的任何版本!
2.24 之前的版本 (Encode 2.87 的一部分) 忽略 檢查旗標。MIME 編碼器對輸入 Unicode 字串使用 非嚴格的 utf8 編碼器,這可能會導致無效的 UTF-8 序列。MIME 解碼器也使用 非嚴格的 utf8 解碼器,並另外使用 Encode::FB_PERLQQ
旗標呼叫解碼方法 (因此使用者指定的 檢查旗標 會被忽略)。此外,當 MIME 編碼字詞包含未知編碼時,它會自動 croak。從 2.24 版開始,此模組使用 嚴格的 UTF-8 編碼器和解碼器。並且 檢查旗標 會正確傳播。
從 2.22 版 (Encode 2.83 的一部分) 開始,MIME 編碼器應完全符合 RFC 2047 和 RFC 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 <pali@cpan.org>