2

ああ、それは簡単ではありません。私はperlでいくつかのメールを解析しようとしています。例を見てみましょう:

From: abc@def.de
Content-Type: multipart/mixed;
        boundary="----_=_NextPart_001_01CBE273.65A0E7AA"
To: ghi@def.de

This is a multi-part message in MIME format.

------_=_NextPart_001_01CBE273.65A0E7AA
Content-Type: multipart/alternative;
        boundary="----_=_NextPart_002_01CBE273.65A0E7AA"


------_=_NextPart_002_01CBE273.65A0E7AA
Content-Type: text/plain;
        charset="UTF-8"
Content-Transfer-Encoding: base64

[base64-content]
------_=_NextPart_002_01CBE273.65A0E7AA
Content-Type: text/html;
        charset="UTF-8"
Content-Transfer-Encoding: base64

[base64-content]
------_=_NextPart_002_01CBE273.65A0E7AA--
------_=_NextPart_001_01CBE273.65A0E7AA
Content-Type: message/rfc822
Content-Transfer-Encoding: 7bit

X-MimeOLE: Produced By Microsoft Exchange V6.5
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: multipart/mixed;
        boundary="----_=_NextPart_003_01CBE272.13692C80"
From: bla@bla.de
To: xxx@xxx.de

This is a multi-part message in MIME format.

------_=_NextPart_003_01CBE272.13692C80
Content-Type: multipart/alternative;
        boundary="----_=_NextPart_004_01CBE272.13692C80"


------_=_NextPart_004_01CBE272.13692C80
Content-Type: text/plain;
        charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

=20

Viele Gr=FC=DFe

------_=_NextPart_004_01CBE272.13692C80
Content-Type: text/html;
        charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>...</html>
------_=_NextPart_004_01CBE272.13692C80--
------_=_NextPart_003_01CBE272.13692C80
Content-Type: application/x-zip-compressed;
        name="abc.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
        filename="abc.zip"

[base64-content]

------_=_NextPart_003_01CBE272.13692C80--
------_=_NextPart_001_01CBE273.65A0E7AA--

このメールは、Outlookから別のメッセージを添付して送信されます。ご覧のとおり、これはさまざまなコンテンツタイプ(text / plain、text / html、message / rfc_822、application / xyz)を含む非常に複雑なメールです...そしてrfc_822の部分が問題です。このメッセージをMIME::Parserで解析するために、Perl 5.8(Debian Squeeze)でスクリプトを作成しました。

use MIME::Parser;
my $parser = MIME::Parser->new;
$parser->output_to_core(1);
my $top_entity = $parser->parse(\*STDIN);
my $plain_body = "";
my $html_body = "";
my $content_type;
foreach my $part ($top_entity->parts_DFS) {
    $content_type = $part->effective_type;
    $body = $part->bodyhandle;
    if ($body) {
        if ($content_type eq 'text/plain') {
            $plain_body = $plain_body . "\n" if ($plain_body ne '');
            $plain_body = $plain_body . $body->as_string;
        } elsif ($content_type eq 'text/html') {
            $html_body = $html_body . "\n" if ($html_body ne '');
            $html_body = $html_body . $body->as_string;
        }
    }
}
# parsing of attachment comes later
print $plain_body;

最初のメッセージ部分(base64-content)には、STDOUTで正しく表示されるドイツ語のウムラウトが含まれています。ネストされたrfc_822メッセージは、MIME :: Parserによって自動的に解析され、最上位の本文とともに1つのエンティティとしてプールされます。このネストされたrfc_822には、ご覧のとおり、quoted-printableのドイツ語ウムラウトも含まれています。ただし、これらはSTDOUTでは正しく表示されません。するとき

utf8::encode($plain_body);

印刷する前に、quoted-printableウムラウトは正しく表示されますが、base64でエンコードされたウムラウトは表示されません。私は今、rfc_822を個別に抽出し、いくつかのエンコードを実行しようと何時間も試みていますが、何も役に立ちません。他に誰が助けることができますか?

よろしく

4

1 に答える 1

1

コンソールにUTF-8が表示されていると仮定すると、これは理にかなっています。デコードしたものは正しく表示されますが、もちろん、latin1文字は正しく表示されません。
後でUTF-8に変換しますが、データがすでにUTF8である場合、これは意味がありません。したがって、以前のlatin1ウムラウトのみが表示されます。

コンテンツタイプの「文字セット」を確認し、それに応じて行動することなしに、これを正しく行う方法はありません。

于 2011-04-08T13:33:23.083 に答える