使用MIME :: Parser无法解码某些电子邮件

时间:2017-10-05 00:17:09

标签: perl email parsing mime-types mime

我是一个perl新手试图找出MIME :: Parser来解码电子邮件的mime部分。我主要使用它,但是代码中存在缺陷,或者导致消息无法正确解码的其他问题。

这些是从Ubuntu安全邮件列表收到的电子邮件。不知何故,他们在整个文本中都会产生奇怪的字符,而使用alpine阅读电子邮件似乎可以很好地解码它。

以下是电子邮件解码后的一个片段:

 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) && !@mailData) { 
        #print $part->body;
        @mailData = split( '\n', $part->body);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?utf-8\"?/i) && !@mailData) { 
        #print $part->body;
        @mailData = split( '\n', $part->body);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?us-ascii\"?/i) && !@mailData) { 
        #print $part->body;
        @mailData = split( '\n', $part->body);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?windows-1252\"?/i) && !@mailData) { 
        #print $part->body;
        @mailData = split( '\n', $part->body);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?iso-8859-1\"?/i) && !@mailData) { 
        #print $part->body;
        @mailData = split( '\n', $part->body);
     }
 });

稍后我在$ buf上执行各种操作,然后再将其写入数据库。

我已经在这里放置了一个显示此问题的电子邮件

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

请让我知道我可以提供哪些其他信息来正确解码此电子邮件。

1 个答案:

答案 0 :(得分:0)

很遗憾,您链接的示例与您在问题中嵌入的示例不符。此外,您的代码不会显示输出完成的位置和方式,即您不提供Minimal, Complete, and Verifiable example,而是仅显示可能表明您正在执行的操作的片段,但实际上并未显示您正在执行的操作

基于此,我只能猜出问题是什么,但不能验证这个猜测。我的猜测是问题在于你使用Email::MIME::body代替Email::MIME::body_str。记录在案body “解码并返回对象的主体作为字节字符串,而body_str “解码内容 - 身体的转移编码层(如身体方法)以及身体的charset编码(与身体方法不同),返回 Unicode字符串

换句话说,body为您提供UTF-8编码消息的原始八位字节body_str为您提供字符。最后一个可能是你真正想要的。