在网站上解析并显示MIME多部分电子邮件

时间:2010-06-18 10:57:48

标签: perl email mime cpan template-toolkit

我有一个原始电子邮件(MIME multipart),我想在网站上显示它(例如在iframe中,带有HTML部分和纯文本部分的标签等)。是否有任何CPAN模块或Template :: Toolkit插件可用于帮助我实现这一目标?

目前,看起来我必须使用Email :: MIME解析消息,然后遍历所有部分,并为所有不同的mime类型编写处理程序。

这是一个很长的镜头,但我想知道是否有人已经完成了这一切?如果我自己尝试,那么编写处理程序将会是一个长期且容易出错的过程。

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

我实际上刚刚在几个月前处理过这个问题。我为我工作的产品添加了一个电子邮件功能,包括发送和接收。第一部分是向用户发送提醒,但我们不想为我们的客户管理员管理退回,我们决定有一个消息收件箱,管理员可以在没有我们的情况下看到退回和回复,管理员可以处理调整电子邮件地址,如果他们需要。

因此,我们接受发送到我们观看的收件箱的所有电子邮件。我们使用VERP将电子邮件与用户关联,并将整个电子邮件按原样存储在数据库中。然后,当管理员要求查看电子邮件时,我们必须解析该电子邮件。

我的第一次尝试与之前的回答非常相似。如果其中一个部分是html,请显示它。如果是文本,请显示它。否则,显示原始的原始电子邮件。通过sendmail不生成的一些电子邮件,这很快就崩溃了。 Outlook,Exchange和其他一些电子邮件系统不这样做,他们使用多部分来发送电子邮件。经过大量的挖掘和诅咒,我发现这个问题似乎没有得到很好的记录。在查看MHonArc并阅读RFC(RFC2045和RFC2046)的帮助下,我找到了下面的解决方案。我决定不使用MHonArc,因为我无法轻松地重新使用解析和显示功能。我不会说这是完美的,但我们使用它已经足够了。

首先,获取消息并使用Email :: MIME进行解析。然后调用一个名为get_part的函数,其中包含Email :: MIME的部分数组,为您提供 - > parts()。

get_part,对于传递的每个部分,解码内容类型,在哈希中查找,如果存在,则调用与该内容类型关联的函数。如果解码器能够给我们一些东西,就把它放在一个结果数组上。

最后一块拼图是这个解码器阵列。基本上,它定义了我可以处理的内容类型:

  • text / html的
  • 文字/纯
  • 消息/传递状态,实际上也是纯文本
  • 多部分/混合
  • 多部分/相关
  • 多部分/替代

我按原样返回的非多部分部分。使用混合,相关和替代,我只需在该MIME节点上调用get_parts并返回结果。因为替代是特殊的,所以在调用get_parts之后它有一些额外的代码。它只会返回html,如果它有一个html部分,或者只返回它的文本部分有一个文本部分。如果两者都没有,则不会返回任何有效的内容。

有效内容类型的哈希的优点是我可以根据需要轻松地为更多部分添加逻辑。当你的get_parts完成时,你应该拥有一系列你关心的所有内容。

我应该提一个项目。作为其中的一部分,我们创建了一个实际上为这些消息提供服务的单独域。管理员处理的主域将拒绝提供消息并将浏览器重定向到我们的用户内容域。此第二个域仅提供用户内容。这是为了帮助浏览器正确地将内容沙盒远离我们的主域。查看相同的原始政策(http://en.wikipedia.org/wiki/Same_origin_policy

答案 1 :(得分:4)

这对我来说听起来不是一件困难的工作:

use Email::MIME;
my $parsed = Email::MIME->new($message);
my @parts = $parsed->parts; # These will be Email::MIME objects, too.
print <<EOF;
<html><head><title>!</title></head><body>
EOF
for my $part (@parts) {    
    my $content_type = $parsed->content_type;
    if ($content_type eq "text/plain") {
         print "<pre>", $part->body (), "</pre>\n";
    }
    elsif ($content_type eq "text/html") {
        print $part->body ();
    }        
    # Handle some more cases here
}
print <<EOF;
</body></html>
EOF

答案 2 :(得分:2)

重用现有的完整软件。 MHonArc mail-to-HTML converter具有出色的MIME支持。