このエントリーをはてなブックマークに追加 hatena-bookmark fb-like g-plusone
line-it
pocket
  • 作成日時:
  • 更新日時:

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

このエントリーをはてなブックマークに追加 hatena-bookmark fb-like g-plusone
line-it
pocket