內容

名稱

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-HeaderMIME-BMIME-Q

說明

解碼方法會將電子郵件標頭的非結構化欄位主體 (或 RFC 822 的「文字」權杖) 作為輸入,並根據 RFC 2047RFC 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-HeaderMIME-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 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 <pali@cpan.org>

另請參閱

編碼RFC 822RFC 2047RFC 2231