Perl で、SpamAssassin を使って迷惑メールを処理する。

オープンソースで迷惑メールの処理するソフトといえば SpamAssassin (直訳するとスパム暗殺者)が有名だ。何しろ spamassassin.apache.org というサイト名からも分かるとおり、Apache Foundation 謹製なのだ。

その SpamAssassin、Perl で書かれている。なので当然 Perl のライブラリが用意されており、Perl 使いの人は簡単に自身のプログラム中から呼び出すことができる。SpamAssassin 自体はメールサーバのフロントエンドで、Procmail なんかと一緒に使うことが多いだろうから、あまり自身のプログラム中から呼び出すようなことはないとは思うのだが、何かのときに役に立つかもしれないから、とりあえず以下にサンプルを載せておこう(というかこのサイトのすべての内容自体、自分のためのメモなのでご了承を)。

#!/usr/bin/perl use Mail::SpamAssassin; use Mail::SpamAssassin::Message; our $MAIL_DIR = '/home/username/spam/spams'; our $SPAM_MAIL_FILE = "spam.txt"; # 迷惑メールをテキストファイルで用意、$MAIL_DIR に置く。 print "File: $SPAM_MAIL_FILE\n"; open(IN, $SPAM_MAIL_FILE) || die; while() { $message .= $_; } # print $message; close(IN); my $spamtest = Mail::SpamAssassin->new(); my $mail = $spamtest->parse($message); my $status = $spamtest->check($mail); $message = $status->rewrite_mail(); if ($status->is_spam()) { print "status: " . $status->is_spam() . "\n"; print "----------------------\n"; print $message; print "----------------------\n"; } $status->finish(); $mail->finish();

基本的な使い方としては、

  • Mail::SpamAssassin オブジェクトを new する。このオブジェクトはファクトリーパターンで生成されるらしく、シングルトンらしい。
  • Mail::SpamAssassin->parse(メール=テキストファイル) で Mail::SpamAssassin::Message オブジェクトを取り出す。
  • Mail::SpamAssassin::Message->check(Mail::SpamAssassin::Message オブジェクト) で、$status を取り出す。このとき、$status は Mail::SpamAssassin::PerMsgStatus オブジェクトなので、注意!
  • ゆえに、最後には Mail::SpamAssassin::PerMsgStatus オブジェクトのメソッドを使って、たとえば Mail::SpamAssassin::PerMsgStatus->get_score() とか Mail::SpamAssassin::PerMsgStatus->get_report() とかすると、迷惑メールと判定されるときのスコアやそのときの条件を列挙したレポートが取得できる。