Mail::SpamAssassin
某案件でメールをPerlからパースしてSPAMかどうか判定せねばならなくなったのでメモ。
SPAMを学習するにはこんな感じ。
#!/usr/bin/perl use strict; use warnings; use Mail::SpamAssasin; my $f = Mail::SpamAssasin->new; my $message = do { local $/; <> }; my $mail = $f->parse($message); $f->learn($mail,undef,1);
newしてメールをparseして学習させる。
$status = $f->learn ($mail, $id, $isspam, $forget)
となっていて、$idはMessage-Id。ここではメール一通突っ込む感じなので省略。$isspamを0にするとスパムじゃないメールとして学習。$forgetを1にすると、このメールに含まれる要素を忘れる。
チェックはこんな感じ。
#!/usr/bin/perl use strict; use warnings; use Mail::SpamAssassin; my $f = Mail::SpamAssassin->new; my $message = do { local $/; <> }; my $mail = $f->parse($message); my $status = $f->check($mail); if ($status->is_spam()) { warn 'SPAM!'; }
ですって。簡単ですね。いちいち$fを作ってると結構重いけど。あそうそう、SPAMの対義語はHAMらしい。あ、それとここに書いた
my $message = do { local $/; <> };
ですけど、
$ cat ./spam.mail | perl learn_spam.pl
とか
$ perl learn_spam.pl < ./spam.mail
みたいにしてSTDINを読みますよ。
Mail-SpamAssassin-3.4.2 - Apache SpamAssassin is an extensible email filter which is used to identify spam - metacpan.org
追記
id:yappo先生から添削あり。↓これで
my $message = do { local $/; <> };
↓これと一緒。↑こっちを使うべし。joinおそい。
my $message = join('', <>);