1

我使用以下代码使用 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();

我遇到的问题是它将“sample-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 

而该信息 - 是 - 在文件中。让我担心的是,在文档中,它声明“Parse 将返回一个 Mail::SpamAssassin::Message 对象,其中只解析了标头。”。这是否意味着它不会返回完整的消息?

4

2 回答 2

1

您缺少一个字符:

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

从文档(强调添加):

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

Parse 将返回一个Mail::SpamAssassin::Message仅解析了标头的对象。调用此函数时,可以传入两个可选参数:$messageis undef(将使用STDIN)、整个消息的标量、消息的数组引用(每个数组元素 1 行)或保存的文件 glob消息的全部内容;和$parse_now,它指定是否在解析时或以后根据需要创建 MIME 树。

通过上面的更改,我得到以下输出(HTML 剥离):

pts 规则名称 描述
---- ---------------------- ------------ --------------------------
-2.6 BAYES_00 BODY:贝叶斯垃圾邮件概率为 0 到 1%
                            [得分: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>最后四个示例以按预期运行。

于 2010-02-04T14:44:40.010 回答
0

这是构造消息的正确方法:

my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });
于 2010-02-04T16:04:05.100 回答