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が正常に動かないことを気にしていたので, 解決してホッとしました.