[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+] |
ここのところ spam がたくさん来るので、ちょっとだけ対策をしました。
普段、mew でメールを読んでいますので、
bogofilter を使った、
ごく一般的な対策をしてみました。
メールサーバは Debian GNU/Linux woody ですが、
mew は Vine Linux 2.5 上で使っています。
ですので、bogofilter は双方に入れました。
あ、ちなみに、mew は 4.0.62 です。
Vine の場合、Rpmfind.net で見つけた srpm から作成しました。
% rpm --rebuild ~/rpm/SRPMS/bogofilter-0.16.0-1.src.rpm ... % su - Password: # rpm -i ~usu/rpm/RPMS/i386/bogofilter-0.16.0-1.i386.rpm |
Debian の場合は、ソースから普通に作成しました。
ただし、libdb3 と libdb3-dev が必要でした。
prefix に /usr/local/bogofilter を指定していますが、お好きなようにしてください。
% su - Password: # apt-get install libdb3 libdb3-dev ... # ^D % tar xfz /some/where/bogofilter-0.16.0.tar.gz % cd bogofilter-0.16.0 % ./configure --prefix=/usr/local/bogofilter ... % make ... % su Password: # make install ... |
まずは、学習させます。
スパムメールを学習させるには、以下のようにします。
% bogofilter -s -N -v < /some/where/spam_mail.txt # xxx words, 1 message |
-v オプションを付けないと何も出力されませんが、学習はしてくれます。
もし ~/.mail/spam 以下のファイルがすべてスパムメールで、
これらを学習させたいなら、以下のようにすると楽です。
# あ、以下は sh 系のシェル(bash など)の場合です。
% for file in ~/.mail/spam/*; do > bogofilter -s -N -v < $file > done ... |
逆に、スパムじゃないメールを学習させるには、以下のようにします。
% bogofilter -n -S -v < /some/where/ham_mail.txt # xxx words, 1 message |
次に、判定させてみます。
引数なしで実行すると、スパムと判定される場合は 0 を、
そうでない場合はそうでない値を返します。
% bogofilter -v < /some/where/spam_mail.txt X-Bogosity: Yes, tests=bogofilter, spamicity=1.000000, version=0.16.0 % bogofilter -v < /some/where/ham_mail.txt X-Bogosity: No, tests=bogofilter, spamicity=0.495330, version=0.16.0 |
-v オプションを付けないと何も言いませんが、判定はしてくれます。
% bogofilter < /some/where/spam_mail.txt && echo SPAM || echo HAM SPAM % bogofilter < /some/where/ham_mail.txt && echo SPAM || echo HAM HAM |
-p オプションを付けると、メールのヘッダに X-Bogosity: をつけてくれます。
% bogofilter -p < /some/where/spam_mail.txt Return-path: <usouso@usouso.org> Enverope-to: usu@usupi.org ... From: SPAM <usouso@usouso.org> To: usu@usupi.org Subject: Very low price!! X-Bogosity: Yes, tests=bogofilter, spamcity=1.000000, version=0.16.0 Very special low price!! ... |
procmail の機能を使ってやればシンプルで言いと思うのですが、
いろいろ悩んだ挙げ句うまくいきませんでした。
ですので、安直に、~/.forward にスクリプトを指定して、逃げました。
~/.forward の中身は、以下のようにしました。
% cat ~/.forward | /home/usu/bin/forwarder |
ここで指定した forwarder というものは、以下のような単純なシェルスクリプトです。
% cat ~/bin/forwarder #!/bin/sh /usr/local/bogofilter/bin/bogofilter -p | /usr/bin/procmail -d $LOGNAME |
最初の bogofilter で X-Bogosity: ヘッダを付加し、 これを、procmail でメールスプールに置きます。
.emacs に、以下を追加します。
すぐ反映させたいときは、追加した領域を指定して、M-x eval-region します。
(setq mew-spam: "X-Bogosity:") (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Bogosity:" mew-spam-bogofilter))) |
まず、mew 上で学習するには、Summary 上で、スパムのときは ls,
スパムじゃないときは lh と押します。
すると、ミニバッファに、bogofilter の実行結果が出力されます。
あとは、~/.bogofilter/*.db をサーバ上にコピーするだけです。
% scp -p ~/.bogofilter/*.db mailserver:~/.bogofilter/ |
これで、メールをとってくると、スパムと判定されたメールには、 自動的に D マークがつくようになります。
学習させるのと、 ときどきメールサーバに学習結果を反映させないといけないところがなんですが、 思ったよりも便利です。
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-] | |
usu@usupi.org | Last modified : Tue Mar 23 23:10:49 2004 |