logo       

SPAM filtering with bogofilter: msg#00125

emacs.gnus.semi.japanese

Subject: SPAM filtering with bogofilter

ようやっと,長いこと懸案だった spam フィルタリングの設定を見直しました.
参考までに,私の行った設定を報告します.

私は,procmail で

(1) 私のアドレスに直接届くメール
(2) メーリングリストやエイリアス経由で届くメール

を別々の maildir 形式のメールボックスに振り分けておき,直接届いたメー
ルだけを対象に biff を鳴らすという小細工をしています.これは,急ぎのメー
ルにすぐ反応できるようにするためです.

spam は急ぎのメールではありませんから,後者のメールボックスに配送して
欲しい(= 余計な biff を鳴らさないで欲しい).というわけで,procmail で
も bogofilter を呼び出して振り分けることにしました.そうすると,Gnus
でも更にもう一度 bogofilter を呼び出すのは無駄なので,Gnus は
bogofilter によって付与された X-Bogosity へッダを見て振り分けることに
します.

また,通常のグループに spam が残っている状態は嫌いなので,spam と判定
されたメールは即座に spam 用のグループに移動させることにします.

spam.el の基本的なデザインでは,グループを抜ける度に ham/spam のデータ
ベースの更新を行っているようです.この方法は分かり易くて良いのですが,
頻繁にグループに入ったり抜けたりする人にとっては,グループの出入りに余
計な時間がかかることになって,いらいらさせられる原因になります[*].そ
こで,ham/spam データベースの更新は emacs とは無関係(= ユーザーの入出
力とも無関係)のタイミングで行い,誤判定された記事を再登録する操作だけ
を Gnus から制御することにします.

このような方針で設定する手順は以下の通りです.

最初は,この方針のための ~/.procmailrc のサンプルです.

MAILDIR=$HOME/spool

:0 fw
| bogofilter -u -e -p

:0
* ^X-Bogosity: Yes,
other/

:0
* ^TO_username@example\.net
inbox/

:0
other/

これで,直接届いたメールだけが ~/spool/inbox/ 以下に貯まり,spam を含
む不要不急のメールは ~/spool/other/ 以下に貯まります.また,届いたメー
ルが bogofilter によって振り分けられると同時に,そのメールに含まれてい
る単語も spam または ham の単語として登録(-u)されます.

次に,spam.el を使えるようにするための設定を ~/.gnus に書きます.

;; spam.el を使えるようにする
(spam-initialize)

;; spam を貯めるグループの指定
(setq spam-split-group "junk")

;; X-Bogosity: へッダを参照して,ham/spam を振り分ける
(setq spam-use-bogofilter-headers t)

;; 「未承諾広告」を表題に含むメールは spam とする
(setq spam-use-regex-headers t
spam-regex-headers-spam '("^Subject:.*未承諾広告"))

;; (1) junk グループは spam のみを含む
;; (2) 普通のメールグループは ham のみを含む
(setq gnus-spam-newsgroup-contents
'(("\\`nnml:junk\\'" gnus-group-spam-classification-spam)
("\\`nnml:" gnus-group-spam-classification-ham)))

;; 誤判定されたメールのみを登録対象とする.
;; (1) spam を貯めているグループを抜けるとき,見つかった ham を
;; bogofilter に登録する.
;; (2) 普通のグループを抜けるとき,見つかった spam を bogofilter
;; に登録する.
(setq gnus-spam-process-newsgroups
'(("\\`nnml:junk\\'" ((ham spam-use-bogofilter)))
("\\`nnml:" ((spam spam-use-bogofilter)))))

;; 誤判定されたメールのキーワードを,bogofilter のデータベースから
;; 削除しながら,spam/ham の登録を行う.
(setq spam-bogofilter-spam-switch "-Ns"
spam-bogofilter-ham-switch "-Sn")

;; ham なのに spam と誤判定されていたメールは respool する
(setq gnus-ham-process-destinations
'(("\\`nnml:junk\\'" respool)))

;; spam なのに ham と誤判定されていたメールは junk に移動する
(setq gnus-spam-process-destinations
'(("\\`nnml:junk\\'" nil)
("\\`nnml:" "nnml:junk")))

ここまで設定して,

(setq nnmail-split-fancy
'(| (: spam-split)
("x-ml-name" "semi-gnus-ja" "semi-gnus")
"inbox"))

のように書くと,spam は junk に分類され,それ以外のグループには ham だ
けが分類されるようになります.

spam であるにも関わらず ham と誤判定されたメールを見つけた場合は,M-d
で spam マークをつけます.そうすると,そのグループから抜けたときに
junk グループに送り込まれ,同時にキーワードの再学習が行われます.

ham であるにも関わらず spam と誤判定されたメールを見つけた場合は,d な
どで既読マークをつけます.そうすると,junk グループから抜けたときに,
そのメールを適切なグループに respooling すると同時に,キーワードの再学
習が行われます.

[*] この問題を避けるために,

(gnus-registry-initialize)
(setq spam-log-to-registry t)

という指定を ~/.gnus に書き,

(setq gnus-spam-process-newsgroups
'(("\\`nnml:" ((ham spam-use-bogofilter)
(spam spam-use-bogofilter)))))

という普通の設定を試してみたのですが,私の手元では効果が見られませんで
した.具体的には,過去に一旦読んだメールをもう一度読んだ場合,そのグルー
プから抜けるときに,その一旦読んだ(= 学習済のはずの)メールが再び学習対
象となってしまって,

Registering 1 articles with classification ham, check spam-use-bogofilter

というメッセージが現れました.ただ,これは設定を試行錯誤していた時だっ
たので,何か別の間違いが原因だった可能性もあります.

--
土屋 雅稔 ( TSUCHIYA Masatoshi )



<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise