【发布时间】:2019-10-21 07:22:33
【问题描述】:
我有一个 perl 脚本,它使用 MIME::Email 来解析从标准输入接收到的电子邮件,但它不适用于没有部分的电子邮件。我无法在电子邮件发送之前对其进行修改。
我希望能够识别电子邮件的重要部分,无论是 HTML 还是文本,并将其存储在缓冲区中以供以后处理。其中许多电子邮件都来自自动生成的邮件列表。
有时它们似乎只有一个“Content-Type:”标头,没有边界。
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
有时它们有多个文本/纯文本部分,其中一个是电子邮件的正文,另一个是签名。
这之后还有一些其他的标题行,但是正文只是显示,没有任何边界标记。
这是我两年前的帖子,展示了我是如何最终弄清楚如何用部分解析大多数电子邮件的 Parsing email with Email::MIME and multipart/mixed with subparts
use strict;
use MIME::Parser;
use MIME::Entity;
use Email::MIME;
use Email::Simple;
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);
$entity->dump_skeleton;
my $num_parts = $entity->parts;
for (my $i=0; $i < $num_parts; $i++) {
my $part = $entity->parts($i);
my $content_type = $part->mime_type;
my $body = $part->as_string;
print "body: $body\n";
}
从不打印正文。仅来自 dump_skeleton 的以下内容:
Content-type: text/plain
Effective-type: text/plain
Body-file: NONE
Subject: Security update
我真的很希望能够修改我现有的脚本(在上一篇 stackexchange 帖子中显示),以便能够无边界地打印这样的电子邮件。
这是糟糕的格式吗?如果没有复杂的步骤来按部分分析整个邮件,我一直无法找到任何可用于可靠地打印电子邮件的正文、主题和其他基本标题的库示例。
我知道 mimeexplode 可以做到,但我不知道怎么做。我需要将邮件正文存储在缓冲区中以进行操作,因此使用像 mimeexplode 这样的命令行程序无论如何都是一种迂回的方式。
【问题讨论】: