我怎样才能得到一个完整的Mail ::从文本的SpamAssassin ::对象MAILMESSAGE?

StackOverflow https://stackoverflow.com/questions/2199442

  •  25-09-2019
  •  | 
  •  

我使用下面的代码来生成使用SpamAssassin的垃圾邮件报告:

use Mail::SpamAssassin;

my $sa = Mail::SpamAssassin->new();

open FILE, "<", "mail.txt";
my @lines = <FILE>;
my $mail = $sa->parse(@lines);

my $status = $sa->check($mail);

my $report = $status->get_report();
$report =~ s/\n/\n<br>/g;

print "<h1>Spam Report</h1>";
print $report;

$status->finish();
$mail->finish();
$sa->finish();

我的问题是,它进行分类“采样nonspam.txt”为垃圾邮件:

Content preview: [...] 

Content analysis details: (6.9 points, 5.0 required) 

pts rule name description 
---- ---------------------- -------------------------------------------------- 
-0.0 NO_RELAYS Informational: message was not relayed via SMTP 
1.2 MISSING_HEADERS Missing To: header 
0.1 MISSING_MID Missing Message-Id: header 
1.8 MISSING_SUBJECT Missing Subject: header 
2.3 EMPTY_MESSAGE Message appears to have no textual parts and no 
Subject: text 
-0.0 NO_RECEIVED Informational: message has no Received headers 
1.4 MISSING_DATE Missing Date: header 
0.0 NO_HEADERS_MESSAGE Message appears to be missing most RFC-822 headers 

和文件中的该信息-is-。我担心的是,在文档中,它指出“解析会返回一个邮件:: SpamAssassin的:: Message对象只解析的头。”这是否意味着它不会返回一个完整的邮件?

有帮助吗?

解决方案

您错过一个字:

my $mail = $sa->parse(\@lines);

从文档(与强调):

  

parse($message, $parse_now [, $suppl_attrib])

     

解析将返回一个Mail::SpamAssassin::Message对象只解析的报头。当调用此函数,存在可以在被传递两个可选参数:$message要么undef(将使用STDIN),整个消息的一个标量,的该消息的每个阵列元件1线的阵列的参考或保持该消息的整个内容的文件水珠;和$parse_now,指定是否要在分析时或以后在必要时创建的MIME树其中。

通过以上的变化时,得到如下的输出(HTML剥离):

 pts rule name              description
---- ---------------------- --------------------------------------------------
-2.6 BAYES_00               BODY: Bayesian spam probability is 0 to 1%
                            [score: 0.0000]

作为文档提到,parse是柔性的。你也可以使用

my $mail = $sa->parse(join "" => <FILE>);  # scalar of the entire message

my $mail = $sa->parse(\*FILE);             # a file glob with the entire contents

my $mail;
{ local $/; $mail = $sa->parse(<FILE>) }   # scalar of the entire message

或甚至

open STDIN, "<", "mail.txt" or die "$0: open: $!";
my $mail = $sa->parse(undef);              # undef means read STDIN

您预期会删除my @lines = <FILE>这些过去四个例子功能。

其他提示

这是建立一个消息以正确的方式:

my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top