::
Home > FreeBSD > ArchiveList > 2005-4
«Prev | | 1 || Next»

2005-04-18

bsfilter / FreeBSD

これまで SPAM 対策に SpamAssassin を使ってきました。引っかからないメールも増えてきたようですし学習させる方法もよくわかりませんでしたので、他の SPAM フィルターを探してみました。メインのメールクライアントとして使っている Mew と連携しているということでなので bsfilter を使ってみることにしました。

まず、サーバ・クライアントの両方で ports/mail/bsfilter/ を make install しました。SpamAssassin 同様 bsfilter の使い方はいろいろあるようですが、ユーザ毎に procmail を利用して適用するようにしました。サーバ*1~/.forward
"|IFS=' ' && p=/usr/local/bin/procmail && test -f $p && exec $p -Yf- || exit 75 #iuser

と作成し、~/.procmailrc
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log
SENDMAIL=/usr/local/sbin/sendmail # postfix

:0fw:
| /usr/local/bin/bsfilter --auto-update --pipe --insert-flag --insert-probabilit
y

# Work around procmail bug: any output on stderr will cause the "F" in "From"
# to be dropped.
:0
* ^^rom[ ]
{
LOG="*** Dropped F off From_ header! Fixing up. "

:0 fhw
| sed -e '1s/^/F/'
}
と作成しました。
~/.bsfilter/bsfilter.conf
jtokenizer kakasi
とだけ記述し、準備完了です。これで自動的に学習してくれるようですし、SPAM と判断したメールには、ヘッダーに
X-Spam-Flag: YES
と追加してくれます。

クライアント側では、こちらを参考に ~/.bsfilter/bsfilter.conf
imap-server imap サーバ名
imap-auth login
imap-user imap ユーザ名
imap-password imap パスワード*2
jtokenizer kakasi
と作成しました。
~/.emacs
(setq mew-spam: "X-Spam-Flag:")
を追加し、~/.mew.el には
; put "D"
(defun mew-spam-bsfilter (val)
(let ( (case-fold-search t) )
(if (string-match "yes" val) ?D)))

; put "o +sapm" at inc
;(defun mew-spam-bsfilter (val)
; (let ( (case-fold-search t) )
; (if (string-match "yes" val) "+spam")))

(setq mew-inbox-action-alist
'( ("X-Spam-Flag:" mew-spam-bsfilter) ) )

; for "ls" (learn-spam)
(setq mew-spam-prog "bsfilter")
(setq mew-spam-prog-args '("-C" "-s" "-u"))

; for "lh" (learn-ham)
(setq mew-ham-prog "bsfilter")
(setq mew-ham-prog-args '("-c" "-S" "-u"))

; for "bm" (mark-spam)
(define-key mew-summary-mode-map "bm" 'mew-summary-bsfilter-mark-region)

(defun mew-summary-bsfilter-mark-region (&optional arg)
"study/judge the region and put the '*' mark onto spams.
need to re-learn if judgment of bsfilter is wrong"
(interactive "P")
(mew-pickable
(let ( (func 'mew-summary-pick-with-cmd)
(mew-inherit-grep-cmd "bsfilter -a --list-spam") )
(mew-summary-pick-body func t nil 'nopattern))))
を追加しました*3。これで、X-Spam-Flag: YES がヘッダーに追加されたメールには D マークがつきますし、サマリーモードで lh, ls を使って学習できます。学習結果は、~/.bsfilter/ の

C.clean.sdbm.dir
C.clean.sdbm.pag
C.prob.sdbm.dir
C.prob.sdbm.pag
C.spam.sdbm.dir
C.spam.sdbm.pag
ja.clean.sdbm.dir
ja.clean.sdbm.pag
ja.prob.sdbm.dir
ja.prob.sdbm.pag
ja.spam.sdbm.dir
ja.spam.sdbm.pag

というファイルなどに保存されるようです。Mew で学習した結果をサーバ側に反映させるため

% bsfilter --export-spam > spam.txt
% bsfilter --export-clean > clean.txt

で作成した spam.txt, clean.txt をサーバに転送し

% bsfilter --import-spam < spam.txt
% bsfilter --import-clean < clean.txt
% bsfilter --update

で、更新させています。今のところ、問題なく動いているようです*4。今後に期待です。

  • *1 Postfix で Maildir を利用しています
  • *2 ここまでは私の使い方では必要ないようですが、こちらのようなことを行うためには必要です
  • *3 Mew4 を使っています
  • *4 とりあえず SpamAssassin で SPAM と判定されたメールを学習させてみました

01:23:56 - No Trackbacks | Permalink Posted by ippo - No comments


«Prev | | 1 || Next»


ポチッとお願いします
   ↓