どのように私は完全なメール::テキストからのSpamAssassin ::はMailMessageオブジェクトを取得することができますか?
-
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
オブジェクトを返します。この関数を呼び出すときに渡すことができる2つのオプションのパラメータがあります$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
期待どおりに機能するこれらの最後の4つの例についてmy @lines = <FILE>
を削除したい。
他のヒント
このメッセージを構築するための正しい方法です。
my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });
所属していません StackOverflow