メイルフィルタリング(クライアント)
一般的な 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 のログ観察を しばらく続けて、精度を高めていけばよい。
参考
- おいぬま日報 … 各ユーティリティの組合せの発想をいただきました。
- POPFile ドキュメント … ちゃんとした翻訳です。
- POPFile 関係の雑記 … POPFile の仕込み手順の参考になりました。
- スパムメールをサーバで振り分ける … POPFile の動かし方のヒントをいただきました。
- fetchmailrc(5) … ports ではローカルに入らなかったので。
- fetchmail の設定 … fetchmail と procmail の組合せの参考になりました。