我正在尝试使用 perl Email::MIME 将电子邮件的多部分/混合部分捕获到缓冲区中。我有一个已经使用了很长时间的脚本,现在在处理特定电子邮件时出现问题,我认为这是因为该电子邮件的格式不正确。
use Email::MIME;
my $buf;
while(<STDIN> ){
$buf .= $_;
}
my @mailData;
my $msg = Email::MIME->new($buf);
my @parts = $msg->parts;
my $desc = $msg->debug_structure;
print "descr: $desc\n";
$msg->walk_parts(sub {
my ($part) = @_;
#warn($part->content_type . ": " . $part->subparts);
my $content_type = $msg->content_type;
if (($content_type =~ m/multipart\/mixed/i) && !@mailData) {
@mailData = split( '\n', $part->body);
print $part->body;
}
elsif (($part->content_type =~ m/text\/plain$/i) && !@mailData) {
@mailData = split( '\n', $part->body);
}
});
以下是电子邮件的相关部分,与显示的完全相同,包括两个连字符线:
Content-Type: multipart/mixed; boundary="===============7958309719180706421=="
Content-Length: 8034
Status: RO
X-Status:
X-Keywords: NonJunk
X-UID: 2
--===============7958309719180706421==
--------------------------------------------------------------------------------
Sending command: "Execute SMART Extended self-test routine immediately in off-line
Drive command "Execute SMART Extended self-test routine immediately in off-line
--------------------------------------------------------------------------------
system security tool that allows system administrators to set authentication
policy without having to recompile programs that handle authentication.
上面的代码将正文添加到@mailData,但仅添加第二行连字符之后的文本。它只是完全跳过它,只收集以“系统安全工具”开头的文本。
它还打印显示部件的描述:
descr: + multipart/mixed; boundary="===============7958309719180706421=="
+
+ text/plain; charset="utf-8"
电子邮件客户端中显示的文本/纯文本部分似乎只是邮件列表信息,而不是实际的正文内容。
这是 Email::MIME 中的错误吗?还是我没有正确处理零件?
编辑:这是完整原始电子邮件的链接 https://pastebin.com/F5MbSfYm
这对我来说就像是 Email::MIME 的问题,而且也是邮件本身的问题:
后一个问题实际上已经存在 10 年了,并且提议的补丁似乎已经存在了 8 年 - 请参阅 https://github.com/rjbs/Email-MIME/issues/14