2017-10-05 19 views
0

私は電子メールのMIME部分をデコードするためにMIME :: Parserを理解しようとしているperlの初心者です。私は主にそれを動作させていますが、コードが不足しているか、またはメッセージが正しくデコードされない原因となる他の問題があります。MIME :: Parserを使用していくつかの電子メールのデコードに失敗しました

これらはUbuntuのセキュリティメーリングリストから受け取ったメールです。どういうわけか彼らはテキストを通して奇妙なÂ文字を作り出しますが、アルパインを使って電子メールを読むとそれをうまく解読するようです。ここで

 Felix Wilhelm, Fermin J. Serna, Gabriel Campana and Kevin Hamacher 
 discovered that Dnsmasq incorrectly handled DNS requests. A remote 
 attacker could use this issue to cause Dnsmasq to crash, resulting in 
 a denial of service, or possibly execute arbitrary code. 
 (CVE-2017-14491)` 

は、私はこのために使用しているコードスニペットです:

use MIME::Parser; 
use MIME::Entity; 
use MIME::WordDecoder; 
use MIME::Tools; 
use MIME::Decoder; 
use Email::MIME; 
my $parser = MIME::Parser->new; 
$parser->extract_uuencode(1); 
$parser->extract_nested_messages(1); 
$parser->output_to_core(1); 
my $buf; 
while(<STDIN>){ 
     $buf .= $_; 
} 
my $entity = $parser->parse_data($buf); 
my $subject = $entity->head->get('Subject'); 
my $from = $entity->head->get('From'); 
my $AdvDate = $entity->head->get('Date'); 
my @mailData; 
my $msg = Email::MIME->new($buf); 
$msg->walk_parts(sub { 
    my ($part) = @_; 
    #warn($part->content_type . ": " . $part->subparts); 
    if (($part->content_type =~ /text\/plain$/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?utf-8\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?us-ascii\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?windows-1252\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?iso-8859-1\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
}); 

後、私は$ bufの上のさまざまな操作を行うことがデコードされていた後、ここで

は、電子メールから1つのスニペットがありますそれをデータベースに書き込む前に。

私はここ

https://pastebin.com/raw/2csUvWup

この問題を呈する私は適切にこのメールを復号化するために提供することができ、他のどのような情報お知らせください電子メールのいずれかのコピーを配置しました。

答えて

0

リンク先の例は、質問に埋め込んだ例と一致しません。また、コードには出力がどこでどのくらい正確に表示されているのかわかりません。つまり、Minimal, Complete, and Verifiable exampleは提供していませんが、実際に何をしているのかを示す断片だけを表示します。

これに基づいて、私は問題の原因しか推測できませんが、この推測を確認することはできません。私の推測では、この問題は、の代わりにEmail::MIME::body_strの使用にあります。文書化されているようbody_strが「(本体法等)本体のコンテンツ転送エンコード層ならびに文字セット符号化の両方をデコードしながらbody「バイト列としてオブジェクトの本体をデコードし返します」 (ボディメソッドとは異なり)ユニコード文字列 ""を返します。言い換えれば

body生オクテットUTF-8でエンコードされたメッセージのbody_str代わり文字を提供しますを提供します。そして、最後のものはおそらくあなたが実際に望むものです。

+0

謝罪します。あなたのオファーのお手伝いをしてくれてありがとう。ここに適切なペーストビンです。 https://pastebin.com/raw/hB7N3h8a またbody_strを使用しようとしましたが、これも機能しませんでした。元の投稿を編集できないようです。ここに私が作成したスクリプトへのペーストビンがあります。 https://pastebin.com/f1pZBvep –

+0

@AlexRegan:スニペットがどこから得られたのか分かりませんが、データがutf8なので、utf8の出力を使用する必要があります。つまり、STDOUT 'binmode(STDOUT、":utf8 ");'。そしてあなたはutf8対応ソフトウェアでファイルを読まなければなりません。 –

+0

私は分かりません。これは私が書いたコードです。このことをさらに混乱させないために、私はこのデータを書き込む関数をデータベースに除外しました。 utf8については何も知らない。 MIME :: Parserの目的は添付ファイルの種類を標準のテキストにデコードすることだと思った。それが私の必要なものです。 –

関連する問題