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('', <>);