ひょんなことからProcmailにてメールを振り分けるなど。特定の一覧から愚直にアドレスを遮断できること、ある程度簡単に登録をできること、を目標に速やかに動く。というかレシピをググって使うだけ…なのであったが思わぬ罠が潜んでいたり。
Procmail の紹介とレシピの書き方 よりBLACKLIST=$HOME/.blacklist :0 Wh * ? test -s $BLACKLIST * ? (formail -x From: | fgrep -iqf $BLACKLIST) /dev/null :0 E !hogehoge@example.com
これだけの簡単なお仕事・・・の筈だったが、何故か全ての状況でElse的な条件のの転送が使われてしまう。明らかに真となるようなgrepのオプションや引数を用意しても条件に引っかからない。ところでふと思ったのだけれど作られた言語云々は置いておいて(いずれもCだが) formailも結局は標準入力からのメールのヘッダ抽出つまりはただのテキスト処理であることに気がつく。ので。
BLACKLIST=$HOME/.blacklist :0 Wh * ? test -s $BLACKLIST * ? fgrep -iqf $BLACKLIST /dev/null :0 E !hogehoge@example.com
ですので、私はこうしてみた。はい、条件に引っかかるようになりました。処理速度を考えなければfgrepをgrepにしてもよいかもしれない。というか初めてgrep/egrep/fgrepを意識した気がします。fgrepはやい!
$ cat ~/test.eml | formail -x From: | grep -iqf ~/.blacklist $ echo $? 0
さて、このようなコマンドで試したり、それぞれの結果を確認したりもしたのですが・・・うーん、procmailの中からformailを呼び出す時、もしくは何かが変わるのだろうか。素のログ出力もイマイチ情報少ないですし。あとログといえば.procmailrc、もしくはprocmailに読み込ませるレシピの権限はわりとシビア、オーナーが違っていたり、o+wの状態 (諸事情で書き込み与えてました;) だと動かないしエラーも出さなかったりするので注意。