使用MIME :: Parser无法解码一些电子邮件
问题描述:
我是一个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
出现此问题,请让我知道还有什么其他的信息,我可以提供正确解码这封电子邮件的电子邮件的副本之一。
答
不幸的是,您链接到的示例与您在问题中嵌入的示例不符。此外,您的代码不会显示输出在何处以及如何完成,即您没有提供Minimal, Complete, and Verifiable example,而只显示可能表明您正在做的事情但并未实际显示您正在做的事情的片段。
基于此我只能猜测问题是什么,但不能验证这个猜测。我的猜测是问题在于你使用Email::MIME::body
而不是Email::MIME::body_str
。如记录body“解码并返回对象的主体作为字节串”而body_str“解码两个主体的内容传送编码层(如体法)以及字符集编码(不像身体法),返回一个Unicode字符串“。
换句话说,body
为您提供原始八位组的UTF-8编码的消息的,body_str
代替为您提供字符。最后一个可能是你真正想要的。
我的歉意。非常感谢您的帮助。这是正确的pastebin。 https://pastebin.com/raw/hB7N3h8a 我现在也试过使用body_str,它也没有工作。它看起来像我现在不能编辑我原来的帖子。这是我创建的脚本的一个pastebin。 https://pastebin.com/f1pZBvep –
@AlexRegan:我不知道你从哪里得到了代码片段,但由于数据是utf8,你必须使用utf8输出,即STDOUT'binmode(STDOUT,“:utf8 “);'。你必须使用支持utf8的软件读取文件。 –
我不明白。这是我写的代码。为了不使这个问题更加混淆,我排除了将这些数据写入数据库的功能。它对utf8一无所知。我认为MIME :: Parser的目的是将附件类型解码为标准文本。那是我需要的。 –