我正在尝试使用 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"
在电子邮件客户端中显示的 text/plain 部分似乎只是邮件列表信息,而不是实际的正文内容。
这是 Email::MIME 中的错误吗?还是我没有正确处理这些部分?
编辑:这是完整原始电子邮件的链接 https://pastebin.com/F5MbSfYm