2017-10-05 113 views
0

我是一個perl新手,試圖找出MIME :: Parser來解碼電子郵件的MIME部分。我主要有它的工作,但有代碼不足或其他問題導致郵件不能正確解碼。使用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各種操作然後將其寫入數據庫。

我已經放在這裏

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

出現此問題,請讓我知道還有什麼其他的信息,我可以提供正確解碼這封電子郵件的電子郵件的副本之一。

回答

0

不幸的是,您鏈接到的示例與您在問題中嵌入的示例不符。此外,您的代碼不會顯示輸出在何處以及如何完成,即您沒有提供Minimal, Complete, and Verifiable example,而只顯示可能表明您正在做的事情但並未實際顯示您正在做的事情的片段。

基於此我只能猜測問題是什麼,但不能驗證這個猜測。我的猜測是問題在於你使用Email::MIME::body而不是Email::MIME::body_str。如記錄body「解碼並返回對象的主體作爲字節串body_str「解碼兩個主體的內容傳送編碼層(如體法)以及字符集編碼(不像身體法),返回一個Unicode字符串

換句話說,body爲您提供原始八位組的UTF-8編碼的消息的body_str代替爲您提供字符。最後一個可能是你真正想要的。

+0

我的歉意。非常感謝您的幫助。這是正確的pastebin。 https://pastebin.com/raw/hB7N3h8a 我現在也試過使用body_str,它也沒有工作。它看起來像我現在不能編輯我原來的帖子。這是我創建的腳本的一個pastebin。 https://pastebin.com/f1pZBvep –

+0

@AlexRegan:我不知道你從哪裏得到了代碼片段,但由於數據是utf8,你必須使用utf8輸出,即STDOUT'binmode(STDOUT,「:utf8 「);'。你必須使用支持utf8的軟件讀取文件。 –

+0

我不明白。這是我寫的代碼。爲了不使這個問題更加混淆,我排除了將這些數據寫入數據庫的功能。它對utf8一無所知。我認爲MIME :: Parser的目的是將附件類型解碼爲標準文本。那是我需要的。 –

相關問題