我正在寻找一个模块来尽最大努力从电子邮件的纯文本组件中提取直接级别的内容(即丢弃任何引用的内容和签名块)。
我们已经有了一些可以尝试的代码,所以如果没有现有的模块可以做到这一点,那么新模块名称的想法也会受到赞赏(Text::ExtractImmediateLevelOfContentFromEmail
似乎有点笨拙)。
我正在寻找一个模块来尽最大努力从电子邮件的纯文本组件中提取直接级别的内容(即丢弃任何引用的内容和签名块)。
我们已经有了一些可以尝试的代码,所以如果没有现有的模块可以做到这一点,那么新模块名称的想法也会受到赞赏(Text::ExtractImmediateLevelOfContentFromEmail
似乎有点笨拙)。
我相信没有这样的模块,因为它非常面向任务,并且有各种各样的消息格式样式。只需几行代码即可完成最小的实现:
use Email::MIME;
my $email = Email::MIME->new($message);
my $body;
$email->walk_parts(sub {
my ($part) = @_;
return unless $part->content_type =~ m[text/plain];
$body .= $part->body;
});
# strip quoted lines and attribution line
$body =~ s/^.+ wrote:\n(?=\n* ?>)//m;
$body =~ s/^ ?>.*\n//gm;
# strip signature
$body =~ s/-- \R.+//;
当然,您可能希望添加其他启发式规则以删除以其他语言编写的归属行,以及删除 Outlook 样式的引用文本。如果消息被识别为使用交错式引用,我会建议一些启发式方法来避免引用文本剥离。那是因为如果你去掉引用的文本,交错的回复可能会失去一些意义。
如果您想将其分解为模块,我将其称为Email::ExtractBody
或Email::ExtractText
. 我会在 POD 中强调该模块具有启发式和尽力而为的方法。