bsfilter

bsfilterは日本製のベイジアンスパムフィルタです。日本製のため、日本語のメールにはデフォルトで対応しています。

インストール

  1. gdbmも追加しますが、これは他の依存などですでにインストールされているかもしれません。
    # apt install bsfilter libgdbm3
    bsfilterは標準でSDBMというDBMを使用しますが、データ長に制限があるせいかたまに壊れるようです。そこで、制限のないGDBMというものに入れ替えています。
    また、SPAM判定DBの設定は各ユーザーごとに行うので、インストール後の設定は特にありません。

ユーザーごとの設定

利用準備

  1. ~/.bsfilter/bsfilter.confという設定ファイルを作成し、以下の通り設定します。
    # Mode
    pipe
    
    # Insert X-Spam-Flag
    insert-flag
    
    # Insert X-Spam-Probability
    insert-probability
    
    # Update database
    auto-update
    
    # Use GDBM
    db gdbm
  2. spam / cleanの両メールを用意し、これを学習させます。(実行するとメールの内容が画面に流れます。どうやって表示させないようにすれば良いのかよく分かりません…。)
    $ bsfilter --add-clean ~/Maildir/.clean/cur/*
    $ bsfilter --add-spam ~/Maildir/.spam/cur/*
    $ bsfilter --update
    もしくは、既存のDBからエクスポートしたデータをインポートしてください。
    $ bsfilter --import-clean ./clean.txt
    $ bsfilter --import-spam ./spam.txt
    $ bsfilter --update
  3. spam / cleanのメールをそれぞれ1つ用意し、bsfilterに読み込ませると判定結果を返してきます。これで動作を確認できます。
    $ bsfilter spam.txt
    (メール内容がここに表示される)
    combined probability spam.txt 1 1.000000
    
    $ bsfilter clean.txt
    (メール内容がここに表示される)
    combined probability clean.txt 1 0.000000
  4. これで準備できたので、Maildropに組み込んで判定するよう設定します。(別ページにて説明)

学習設定

誤判定した場合、対象のメールを学習用フォルダに入れておけばcronで自動的に学習するよう設定しておきます。

  1. スパムと誤判定されてしまったメールを"not_spam"フォルダに、フィルタをすり抜けてしまったスパム を"not_clean"フォルダに入れるとした場合、そこ にメールがあるときだけデータベースの更新をするようなスクリプトを書きます。
    なお、最後の方で使っているdoveadmはDovecotでメールを処理するためのコマンドです。フォルダ名が日本語の場合は、そのまま日本語を入れれば通ります。
    # Database update switch
    UPDATE=0
    
    # Maildir
    NOTSPAM="${HOME}/Maildir/.98_others.not_spam"
    NOTCLEAN="${HOME}/Maildir/.99_spam.not_clean"
    
    # False positive
    if [ `ls ${NOTSPAM}/cur | wc -l` -ne 0 ]; then
        bsfilter --sub-spam --add-clean ${NOTSPAM}/cur/*
        UPDATE=1
    fi
    if [ `ls ${NOTSPAM}/new | wc -l` -ne 0 ]; then
        bsfilter --sub-spam --add-clean ${NOTSPAM}/new/*
        UPDATE=1
    fi
    
    
    # SPAM
    if [ `ls ${NOTCLEAN}/cur | wc -l` -ne 0 ]; then
        bsfilter --sub-clean --add-spam ${NOTCLEAN}/cur/*
        UPDATE=1
    fi
    if [ `ls ${NOTCLEAN}/new | wc -l` -ne 0 ]; then
        bsfilter --sub-clean --add-spam ${NOTCLEAN}/new/*
        UPDATE=1
    fi
    
    # Database update
    if [ ${UPDATE} -eq 1 ]; then
        bsfilter --update
        doveadm expunge -u xxx mailbox 98_others.not_spam all
        doveadm expunge -u xxx mailbox 99_spam.not_clean all
    fi
  2. cronに登録します。
    # m h  dom mon dow   command
     05  */1 * *   *    sh ${HOME}/cron/bsfilter_update.sh 1> /dev/null

目次へ戻る