Solaris で bsfilter

bsfilter は、ベイジアンフィルタを使って SPAM とそれ以外のメール(clean)を判別するソフトウェアです。Ruby で書かれており、 日本語のメールに対応しています。動作の形態は次の 3 つです。 UNIX のフィルタとしてファイルやパイプを処理する形態、 IMAP サーバ上のメールを学習・判定する形態、 POP サーバと MUA の間に入る POP プロキシとして動作する形態です。 IMAP over SSL と POP over SSL に対応しています。ライセンスは GPL です。

ここでは、インストール手順と運用上の注意をまとめます。

関連する外部ページ

以前の配布元であった 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 ヘッダの値を使えば、 確率に応じて振り分け先を分けることもできます。