• 作成:

spamcがベイジアンフィルタの学習データを認識しない問題はspamassassinコマンドを直接使ったら解決しました

spamassassinの精度が悪すぎることから調査してみたらspamcコマンドだとベイジアンフィルタの学習データを認識しないことがわかりました.

spamcというのはspamdと組み合わせて使うspamassassin用のクライアントです.

spamassassinを一々立ち上げていると初期化コストがかかるため, これを使えば軽量にスパムチェックが出来ることになっています.

例によって私もこれを使っていました.

しかし, どうもspamassassinの精度が悪すぎることが長年の悩みでした.

全部のスパムメールを認識させて, スパムボックスに入っているスパムメールをspamc < ~/.maildir/.Junk/cur/1410731306.M649677P7004.sonoda,S=4769,W=4835:2,Saのように読み込ませてもスパムではないと判定します.

それどころかブラックリストに入れたアドレスから来たメールすらスパムではないと判定しました.

これは学習データを利用していないのではないかと疑いました.

なんで認識しないんだろうかと思って探ってみた所, たまたまspamassassinコマンドを直接起動してスパムメールを食わせてみたら正常にスパムだと認識しました.

なんでこんなことになっているのかはわかりません.

私は個人向けのメールサーバしか運用していないので, spamassassinコマンドをそんなに大量に実行するわけではないです. なのでひとまずspamdとspamcを使うのはやめて, 一々spamassassinコマンドを呼び出すように.procmailrcを書き換えました.

# SpamAssassin add flag
:0fw
|/usr/bin/spamassassin

これでスパムメールが学習データを見てちゃんとスパムだと認識されるようになりました.

ちなみにham(スパムではない)メールがどうしてそのように分類されたかを見るにはuser_prefs

add_header all Report _REPORT_

と書けばヘッダにちゃんと書いてくれるようですね. Forcing SpamAssassin To Add The X-Spam-Status Header To Ham For Debugging – Dmitry Leskov からの情報です.

linux - Different results from spamassassin and spamc - Stack Overflow によると既知の問題らしいですね. どうも回避策は存在するらしいですが, spamassassinコマンドを直接実行してしまう解決策の方がシンプルで楽ですね.

spamcを使うチュートリアルは溢れていますが, 負荷を気にする大規模サーバ管理者など以外はspamcではなくspamassassinを使いましょう.

数年間spamassassinが正常に動かないことを気にしていたので, 解決してホッとしました.