首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MIME::解析器无法解码一些电子邮件

使用MIME::解析器无法解码一些电子邮件
EN

Stack Overflow用户
提问于 2017-10-05 00:17:09
回答 1查看 812关注 0票数 1

我是一个perl新手,试图找出mime::解析器来解码电子邮件的mime部分。我主要是让它工作,但有一个缺陷,在代码,或其他问题,导致消息无法正确解码。

这些是从Ubuntu安全邮件列表收到的电子邮件。不知怎么的,它们在整个文本中产生了奇怪的字符,而用高山阅读电子邮件似乎可以很好地解码它。

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

代码语言:javascript
复制
 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)`

下面是我为此使用的代码片段:

代码语言:javascript
复制
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

请让我知道,我可以提供的其他信息,以正确解码这封电子邮件。

EN

回答 1

Stack Overflow用户

发布于 2017-10-05 04:26:36

不幸的是,链接到的示例与嵌入在问题中的示例不匹配。此外,您的代码没有显示输出的确切位置和方式,即您没有提供最小、完整和可验证的示例,而是只显示可能指示您正在做什么但没有实际显示您正在做什么的片段。

在此基础上,我只能猜测问题所在,但无法验证这一猜测。我的猜测是,问题在于您使用Email::MIME::body而不是Email::MIME::body_str。如文档所示,正文“以字节字符串__的形式解码和返回对象的主体”,而应激“同时解码主体的内容传输编码层(如body方法)以及主体的字符集编码(与body方法不同)__,返回Unicode字符串__”。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46576062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档