メイルフィルタリング(クライアント)

一般的な pop サーバから FreeBSD な端末でメイルを受け取る際に フィルタリングを行う方法に関するメモ。

ここでは、以下の組合せでやってみる。

第1段階
  pop3 server --> fetchmail --> spool --> MH

第2段階
  pop3 server --> fetchmail --> procmail --> spool/MH

第3段階
  pop3 server --> popfile --> fetchmail --> procmail --> spool/MH

fetchmail の仕込み

インストール自体は簡単。ports から投入すればよい。

# cd /usr/ports/mail/fetchmail
# make install clean

ビルド オプション については、深く考えない。 一般ユーザで mail.local を使用する予定なので、permission を変えておく。

# chmod 4755 /usr/libexec/mail.local

設定ファイルは以下のように作成する。

% vi ~/fetchmail_config_file (ファイルはどこに置いてもいい)
set postmaster "localusername"
set no bouncemail
set properties ""
poll pop3.xxx.yyy.zz with proto POP3
  user 'serverusername' there with password 'serverpass' is localusername here
  mda  "/usr/libexec/mail.local %s"
fetchall

この設定ファイルは以下のように使用する。

% fetchmail -f fetchmail_config_file

これで、サーバから取得したメイルがローカルスプールに溜る。 ローカルにあるので、MH で inc すれば取れる。

procmail の仕込み

fetchmail で取れるようになったので、procmail で分類できるようにする。

インストール自体は簡単。ports から投入すればよい。

# cd /usr/ports/mail/procmail
# make install clean

特に気にするような ビルド オプション はない。設定ファイルを作成する。

% vi ~/.procmailrc
#------------------------------------------------------------ general
PATH=/bin:/usr/bin:/usr/local/bin
LOGFILE=$HOME/log/procmail.log
MAILDIR=$HOME/Mail
LOCKFILE=$HOME/etc/.lockmail
#------------------------------------------------------------ test
:0
*^X-deliver-test: .*hoge.*
 $MAILDIR/zzz/.
#------------------------------------------------------------

% vi ~/.forward
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #localusername"

% vi ~/fetchmail_config_file
poll pop3.xxx.yyy.zz with proto POP3
  user 'serverusername' there with password 'serverpass' is localusername here
  # mda  "/usr/libexec/mail.local %s"
  mda  "/usr/local/bin/procmail -d localusername"  # ← procmail を使うよう変更
keep
# fetchall  # ← テスト時にはサーバから消さないようにしておく

このテストでは、X-deliver-test: ヘッダに キーワード hoge がヒットするものは 勝手に $HOME/Mail/zzz に入り、 そうでないもの(条件にヒットしないもの)はスプールに溜ることになる。 テストがうまくいったら、keep を fetchall に戻せばよい。

popfile の仕込み

procmail のレシピをガシガシ書くのは面倒なので、popfile をフィルタに挟んで マーキングしてもらうことにする。

インストール自体は簡単。ports から投入すればよい。

# vi /etc/make.conf
.if ${.CURDIR} == "/usr/ports/mail/popfile"
WITH_POPFILE_JAPANESE=YES
.endif
# cd /usr/ports/mail/popfile
# make install clean

初回の最初の設定が面倒。実際のところ、どうやって起動するのかすらわからなかった。 ports から入れた場合は /usr/local/sbin/popfile.sh ができるので、 まずこれを適当なところへコピーして、ちょっとだけ編集する。 最終行(/dev/null 送りにしているところ)にコマンドライン引数を追加して、 ポート番号のバッティングを解消するだけでよい。 ここでは、http / pop3 それぞれに 30000 を足してポート番号にすることにした。 このスクリプトでいったん起動し、設定ファイルを作らせる。

% cp /ust/local/sbin/popfile.sh /tmp/popfile1sttime.sh
% vi /tmp/popfile1sttime.sh
(中略)
/usr/local/share/popfile/popfile.pl --set html_port=30080 --set pop3_port=30110
:wq
% /tmp/popfile1sttime.sh

これで、http://localhost:30080/ にブラウザでアクセスできるようになる。 画面から設定を行うので、好きに変更すればよろしい。 ちなみに日本語画面にするには、Language に Nihongo を適用する。 いったん設定ファイルを作ってしまえば、さきほどの初回起動用スクリプトは もう要らない。次からは /usr/local/sbin/popfile.sh を使用すればよい。

% rm /tmp/popfile1sttime.sh

さて、学習させよう。 まずはバケツとして spam と ham を用意しておいて、それぞれ餌を喰わせてあげる。

% insert.pl spam ~/Mail/spam/*
% insert.pl ham ~/Mail/inbox/*

準備は整ったので、fetchmail で取りに行く際にフィルタとして使うようにする。 またしても fetchmail の設定を変更する。

% vi ~/fetchmail_config_file
poll localhost
  proto POP3
  port  30110
  user  "pop3.xxx.yyy.zz:serverusername"
  pass  "pass"
  is localusername here
  mda   "/usr/local/bin/procmail -d localusername"

今度は popfile で分類されたヘッダがついてくるはずなので、 procmail のレシピも追加しておく。

:0
^X-Text-Classification: spam
 $MAILDIR/zzz/.

以上で仕込みは完了。

運用

以上で仕込みは完了。fetchmail を中心にして、

  • サーバに取りに行く時に popfile を挟む。
  • ローカルに溜める時に procmail を挟む。

という構成ができたので、あとは popfile の誤検出を再分類、procmail のログ観察を しばらく続けて、精度を高めていけばよい。


参考

[$Revision: 1.2 $ $Date: 2009.02.17 12:10:56 $]
[EOF]