[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

Mew と bogofilter でプチスパム対策

ここのところ spam がたくさん来るので、ちょっとだけ対策をしました。
普段、
mew でメールを読んでいますので、 bogofilter を使った、 ごく一般的な対策をしてみました。


目次


1. 環境

メールサーバは Debian GNU/Linux woody ですが、 mew は Vine Linux 2.5 上で使っています。
ですので、bogofilter は双方に入れました。
あ、ちなみに、mew は 4.0.62 です。


2. bogofilter のインストール

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
  ...


3. bogofilter の簡単な使い方

まずは、学習させます。
スパムメールを学習させるには、以下のようにします。

  % 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!!
  ...


4. メールサーバ上での設定

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 でメールスプールに置きます。


5. mew の設定

.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 マークがつくようになります。

学習させるのと、 ときどきメールサーバに学習結果を反映させないといけないところがなんですが、 思ったよりも便利です。

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Tue Mar 23 23:10:49 2004