web-dev-qa-db-ja.com

UTF8電子メールヘッダーをデコードします

次の形式のメールの件名があります。

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

電子メールの本文はutf-8base64でエンコードされており、正常にデコードされています。私は現在、PerlのEmail :: MIMEモジュールを使用して電子メールをデコードしています。

=?utf-8区切り文字の意味は何ですか?この文字列から情報を抽出するにはどうすればよいですか?

24
CoffeeMonster

encoded-Word トークン( RFC 2047 による)は、一部のヘッダーの値で発生する可能性があります。それらは次のように解析されます。

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

この場合、文字セットはUTF-8であり、エンコーディングはBで、base64を意味します(他のオプションはQで、Quoted Printableを意味します)。

これを読み取るには、最初にbase64をデコードしてから、UTF-8文字として扱います。

詳細については、主に RFC 2047 などのさまざまなインターネットメールRFCもお読みください。

Perlを使用しているので、 Encode :: MIME :: Header が役立つ可能性があります:

概要

use Encode qw/encode decode/;
$utf8   = decode('MIME-Header', $header);
$header = encode('MIME-Header', $utf8);

概要

このモジュールは、RFC 2047MIMEヘッダーエンコーディングを実装します。 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?....?=
36

EncodeモジュールはそれをMIME-Headerエンコーディングで処理すると思うので、これを試してください。

use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
17
moritz

チェックアウト RFC2047 。 「B」は、最後の2つの「?」の間の部分がbase64でエンコードされていることを意味します。 「utf-8」は当然、デコードされたデータがUTF-8として解釈される必要があることを意味します。

3
marijne

MIME :: Words MIMEツールからもこれに適しています。 Encodeで問題が発生し、Encodeが成功しなかった一部の文字列でMIME :: Wordsが成功したことがわかりました。

use MIME::Words qw(:all);
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <[email protected]>',
);
2
Philonious

これは、ヘッダーの文字セットラベル付けの標準拡張であり、 RFC2047 で指定されています。

1
wnoise