質問
次のような形式のメール件名があります。
=?utf-8?B?T3.....?=
電子メールの本文は utf-8 Base64 でエンコードされており、正常にデコードされています。現在、Perl の Email::MIME モジュールを使用して電子メールをデコードしています。
=?utf-8 区切り文字の意味は何ですか?また、この文字列から情報を抽出するにはどうすればよいですか?
解決
の encoded-word
トークン(に従って RFC2047) は、一部のヘッダーの値で発生する可能性があります。それらは次のように解析されます。
=?<charset>?<encoding>?<data>?=
この場合、文字セットは UTF-8 で、エンコーディングは次のとおりです。 B
これはbase64を意味します(他のオプションは Q
つまり、Quoted Printable を意味します)。
これを読み取るには、まず Base64 をデコードしてから、UTF-8 文字として扱います。
詳細については、さまざまなインターネット メール RFC もお読みください。 RFC2047.
Perlを使っているので、 エンコード::MIME::ヘッダー 役立つかもしれません:
概要
use Encode qw/encode decode/; $utf8 = decode('MIME-Header', $header); $header = encode('MIME-Header', $utf8);
抽象的な
このモジュールは、RFC 2047 MIMEヘッダーエンコーディングを実装します。3つのバリアントエンコード名があります。Mime-Header、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?....?=
他のヒント
Encode モジュールがそれを処理すると思います MIME-Header
エンコーディングがあるので、これを試してください:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
チェックアウト RFC2047. 。「B」は、最後の 2 つの「?」の間の部分が Base64 でエンコードされていることを意味します。「utf-8」は当然、デコードされたデータが UTF-8 として解釈される必要があることを意味します。
MIME::単語 MIME ツールのものもこれに適しています。エンコードで問題が発生し、エンコードが失敗した一部の文字列では MIME::Words が成功したことがわかりました。
use MIME::Words qw(:all);
$decoded = decode_mimewords(
'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
これはヘッダーの文字セットラベル付けの標準拡張であり、で指定されています。 RFC2047.