Procmailの使い方

なんかUNIX Magazine 1998年10月号で詳しい特集が組まれていたらしい。うちあったっけか?
NetBSD/i386 2.0.2にはデフォルトで入ってないのでバイナリパッケージで導入。まずは使いたいユーザがホームディレクトリに「.forward」を以下の内容で作成する。

"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #username"
  • スペースなどで切られないように全体を「"」で囲んでおく。
  • 「|」以降に実行するコマンドを記述する。
  • 区切り文字を示す環境変数IFSには通常スペースが入ってるが、ここが異常な値の場合はセキュリティホールとなりうる可能性があるので意図的にスペースを指定する。
  • execで実行するprocmailのパス名はNetBSDのパッケージの場合「/usr/pkg/bin/procmail」となる。
  • procmailの-f-オプションはFrom行のタイムスタンプを作成する意味。タイムスタンプがある場合は、これを更新する。
  • 「||」以降はprocmailが正常に終了しなかった場合の処理。
  • 「exit 75」とは戻り値として75を返すように終了する意味。75はEX_TEMPFAILのことで、一時的な動作エラー、つまり、もう一度同じことをやれば成功するかもしれないエラーを意味する。これはsendmailにとっては再試行可能なエラーなのでキューに入れよという意味になる。つまり、procmailでの処理が正常に終了しなくても返送されずに済む。
  • 最後の「#username」ってのはコメント。これはsendmailの古いバージョンが.forwardが同じ内容のユーザが複数いた場合に一人分しか処理しないというバグを回避する為に、他のユーザと.forwardが同じにならないようにユーザ名を記述するもの。現在はあまり意味が無いのかも知れない。

続いて「.procmailrc」を以下のような内容で作成する。本当は.forwardが働いた瞬間にprocmailが動き始めるので、.procmailrcを作成してから.forwardを作る方が良い。

:0
* ^Subject: SPAM
! foo@bar.com
  • 最初の「:0」がProcmailの設定(レシピと言う)の始まりを示し、必要なら続けてフラグを記述することが出来る。通常はヘッダを見て処理する「H」が指定されてることになっている。
  • 「*」は条件判断で、続く文字列に一致すれば次の行のアクションを実行する。この場合は「行頭」から「Subject: SPAM」で始まる場合、つまり件名がSPAMで始まる場合に続く処理を行う。
  • 「!」はメールの転送先を指定している。「;」で区切ることで複数指定することも出来る。ここに「!」と付けず「/dev/null」を指定すると転送せずにメールを破棄することも出来る。
  • ちなみに条件にひっかからないメールは通常通りに届く。

他にnkfkakasi、bogofilter、imap-uwの各パッケージを組み合わせて、迷惑メールの分別を行う場合などは・・・。

:0 HB
* ? nkf -Zme | kakasi -w | bogofilter
| dmail +bogofilter
  • 最初の「0:」にヘッダと処理する「H」と、メール本文を処理する「B」を指定。
  • 「*」で始まる条件判断に、「?」以降のコマンドを実行した結果次第で続くアクションを実行することを指定。
  • nkfの-Zは2バイト半角文字をASCII文字に変換、-mはMIMEを解読、-eはEUCコードで出力すること指定、kakasiの-wは単語ごとにスペースで分割、これをbogofilterで迷惑メールかチェックして戻り値を返している。
  • 迷惑メールだった場合に「|」に続くコマンドを実行する。dmailコマンドはimap-uw付属コマンドで「+」以降に指定したIMAPフォルダにメールを溜め込む。尚、このIMAPフォルダに溜め込まれるとPOPアクセスでは見えない。
  • 迷惑メールじゃないメールは通常通りに届く。

尚、IMAPフォルダは空のファイルでも良いので予め作っておく必要がある。また、bogofilterは当然ながら迷惑メールを読み込ませて学習データを作っておかないと判別は出来ない。