Solaris で bsfilter
bsfilter は、ベイジアンフィルタを使って SPAM とそれ以外のメール(clean)を判別するソフトウェアです。Ruby で書かれており、 日本語のメールに対応しています。動作の形態は次の 3 つです。 UNIX のフィルタとしてファイルやパイプを処理する形態、 IMAP サーバ上のメールを学習・判定する形態、 POP サーバと MUA の間に入る POP プロキシとして動作する形態です。 IMAP over SSL と POP over SSL に対応しています。ライセンスは GPL です。
ここでは、インストール手順と運用上の注意をまとめます。
【関連する外部ページ】
- bsfilter の説明: https://nbkenichi.github.io/bsfilter/index.html
- ソースと配布ファイル: https://github.com/nbkenichi/bsfilter
以前の配布元であった bsfilter.org と SourceForge.JP(OSDN)は、現在参照できません。 配布ファイルは GitHub の releases から入手します。
インストール
bsfilter は Ruby で書かれているため、先に Ruby をインストールします。 Solaris 11 では、パッケージリポジトリから導入します。
# pkg install runtime/ruby
# ruby -v
次に、配布ファイルを展開し、bsfilter 本体を実行パスの通ったディレクトリに置きます。
#!/bin/sh cd /usr/local gzip -dc /tmp/bsfilter-1.0.20.tgz | tar -xvf - cp bsfilter-1.0.20/bsfilter/bsfilter /usr/local/bin/bsfilter chown root:bin /usr/local/bin/bsfilter chmod 755 /usr/local/bin/bsfilter
bsfilter は、データベースを利用者ごとのホームディレクトリ (既定では ~/.bsfilter)に作り、利用者自身の権限で動作します。 setuid は設定しません。他人のメールとデータベースに アクセスできる状態になり、Ruby のスクリプトでは無効化される場合もあるためです。
設定
判定を行う前に、SPAM と clean なメールを集めて学習させ、データベースを作成します。 手順は次の 3 つです。
% bsfilter --add-clean ~/Mail/inbox/*
% bsfilter --add-spam ~/Mail/spam/*
% bsfilter --update
--add-clean で clean なメールのトークンを数え、--add-spam で SPAM のトークンを数え、 --update で各トークンの SPAM 確率を計算します。 オプションの一覧は「bsfilter --help」で表示できます。
作成済みのデータベースを別のマシンに移す場合は、テキストファイルへの 書き出しと読み込みを使います。
% bsfilter --export-spam bs.spam
% bsfilter --export-clean bs.clean
% bsfilter --homedir /usr/local/bsfilter --import-spam bs.spam
% bsfilter --homedir /usr/local/bsfilter --import-clean bs.clean
学習が済んだら、bsfilter を立ち上げます。 次の例は、POP プロキシとして動作させる場合です。 POP サーバは pop.example.com のポート 110、 MUA からの接続を受けるポートは 10110 です。 --insert-flag は X-Spam-Flag ヘッダ、--insert-probability は X-Spam-Probability ヘッダを追加し、--auto-update は判定と同時に学習を行います。
% bsfilter --pop --pop-server pop.example.com --pop-port 110 --pop-proxy-port 10110 \
--insert-flag --insert-probability --auto-update
POP サーバが POP over SSL(ポート 995)を使う場合は、--ssl を付けます。 サーバと bsfilter の間は POP over SSL、bsfilter と MUA の間は POP になります。
% bsfilter --ssl --pop --pop-server pops.example.com --pop-port 995 --pop-proxy-port 10110 \
--insert-flag --insert-probability --auto-update
IMAP サーバを使う場合は、サーバ上のメールを直接学習・判定できます。 次の例は、inbox の未フラグのメールを判定し、ヘッダを追加して、 SPAM を inbox.spam に移動します。
% bsfilter --imap --imap-fetch-unflagged --insert-flag --insert-probability \
--imap-folder-spam inbox.spam inbox
クライアント側の設定
mew を使う場合の設定です。POP プロキシのポートを指定し、 X-Spam-Flag ヘッダを見て +spam フォルダに振り分けます。
mew.el に
(setq mew-pop-port "10110")
(setq mew-refile-guess-alist
'(("X-Spam-Flag:"
("Yes" . "+spam"))))
procmail を使う場合は、bsfilter の終了ステータス(SPAM のとき 0)や、 追加されたヘッダを条件にして振り分けます。
:0 fw | /usr/local/bin/bsfilter --pipe --insert-flag --insert-probability :0 * ^X-Spam-Flag: *Yes spam/
運用上の注意
判定の精度は、学習に使ったメールに依存します。 ある利用者のメールで学習させたデータベースを別の利用者に適用すると、 精度が下がります。したがって、データベースは利用者ごとに作成する運用が適しています。
SPAM でないメールを SPAM と判定する誤り(false positive)への対策として、 SPAM と判定したメールを削除せず、専用のフォルダに振り分ける設定にします。 --insert-probability で付加される X-Spam-Probability ヘッダの値を使えば、 確率に応じて振り分け先を分けることもできます。