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 

そして、その情報はファイルにあります。私が心配しているのは、ドキュメントに「解析すると、ヘッダーだけが解析されたMail :: SpamAssassin::Messageオブジェクトが返される」と記載されていることです。それは完全なメッセージを返さないことを意味しますか?

4

2 に答える 2

1

1つの文字が欠落しています:

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

ドキュメントから(強調が追加されています):

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

ParseはMail::SpamAssassin::Message、ヘッダーのみが解析されたオブジェクトを返します。この関数を呼び出す場合、渡すことができる2つのオプションのパラメーターがあります$message。メッセージ全体のスカラー、配列要素ごとに1行のメッセージの配列参照、または保持するファイルグロブのいずれかです。メッセージの内容全体。および。これは、必要に応じて、解析時またはそれ以降にMIMEツリーを作成するかどうかを指定します。undefSTDIN$parse_now

上記の変更により、次の出力が得られます(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>これらの最後の4つの例を削除すると、期待どおりに機能します。

于 2010-02-04T14:44:40.010 に答える
0

これは、メッセージを作成する正しい方法です。

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