我是一個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
出現此問題,請讓我知道還有什麼其他的信息,我可以提供正確解碼這封電子郵件的電子郵件的副本之一。
我的歉意。非常感謝您的幫助。這是正確的pastebin。 https://pastebin.com/raw/hB7N3h8a 我現在也試過使用body_str,它也沒有工作。它看起來像我現在不能編輯我原來的帖子。這是我創建的腳本的一個pastebin。 https://pastebin.com/f1pZBvep –
@AlexRegan:我不知道你從哪裏得到了代碼片段,但由於數據是utf8,你必須使用utf8輸出,即STDOUT'binmode(STDOUT,「:utf8 「);'。你必須使用支持utf8的軟件讀取文件。 –
我不明白。這是我寫的代碼。爲了不使這個問題更加混淆,我排除了將這些數據寫入數據庫的功能。它對utf8一無所知。我認爲MIME :: Parser的目的是將附件類型解碼爲標準文本。那是我需要的。 –