使用 MIME::Entity 将 HTML 电子邮件转换为纯文本

Posted

技术标签:

【中文标题】使用 MIME::Entity 将 HTML 电子邮件转换为纯文本【英文标题】:HTML email to plain text with MIME::Entity 【发布时间】:2013-04-26 10:49:27 【问题描述】:

我正在使用 perl 脚本将 html 邮件转换为纯文本。

当前代码(用于多部分邮件)如下所示:

my $parser = new MIME::Parser;
my $entity = $parser->parse(\*STDIN) or die "parse failed\n";

for my $part ($entity->parts()) 
 if ($part->mime_type eq 'text/html') 
 my $bh = $part->bodyhandle;

 my $tree = HTML::TreeBuilder->new();
 $tree->utf8_mode();
 $tree->parse($bh->as_string);

 my $formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 72);
 my $txt = $formatter->format($tree);

 my $txtEntity=MIME::Entity->build(Data  => $txt,
                                 Type  => "text/plain",
                                 Encoding => "8bit"
                                 );

 $entity->add_part($txtEntity,0);
 

$entity->print(\*STDOUT);

它可以工作,但它只是将纯文本部分添加到现有部分,而不是替换 HTML 部分。 所以我想出了这个:

my $head = $entity->head;

my $txtEntity=MIME::Entity->build(Data  => $txt,
                               Type  => "text/plain",
                               Encoding => "8bit",
                               From    => $head->get('From',0),
                               To      => $head->get('To',0),
                               Subject => $head->get('Subject',0),
                               Cc => $head->get('Cc',0)
                               );

$txtEntity->print(\*STDOUT);

但这可能会删除电子邮件标题的某些部分。 有没有用纯文本完全替换 HTML 正文的功能?

谢谢!

【问题讨论】:

add_part 假定它是多部分消息。 @devnull 是的,我真的不知道在昨天更改之前我是怎么做到的。我用多部分代码编辑了问题,这并不重要,因为问题也存在。 【参考方案1】:

如果您没有办法替换正文而不是添加新部分,这可能是 formail 实用程序(procmail 的一部分)的工作,它可以生成带有旧电子邮件标题的新电子邮件,替换你想要替换的东西(比如编码和内容类型标题)。

另外,您可以尝试将编码更改为纯文本。您仍然会看到 HTML 代码,但它不会呈现,并且您还会看到添加的纯文本/文本,尽管我承认这是一个糟糕的解决方案。

【讨论】:

以上是关于使用 MIME::Entity 将 HTML 电子邮件转换为纯文本的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MIME::Entity 部分的内容配置中获取名称?

使用 android 意图将 html 文件作为电子邮件正文内容发送

无法使用 javamail 将 HTML 电子邮件发送到 Gmail

查询将查询转换为HTML并通过电子邮件发送

使用 MPDF 将 HTML 保存为 PDF 和电子邮件

使用 HTML 电子邮件添加纯文本后备