MTA(メール配送エージェント)の一つ、procmailのレシピ(.procmailrc) の Tips を紹介しています。
関連するページはこちら、
メール関係全体はこちら
MacOSX & Cygwin on Windows のソフトの事
Emacs 関係はこちら
メールは、fetchmail で取得して、procmail で、色々な処理をコントロールして、最終的に、フォルダーに振り分けています。
初めて、.procmailrc を書いてから、既に5年以上が経ちますが、やっと、まともに使えるようになったかと思います。
procmail は、
等、問題がありますが、多くのシステム上(UNIX, Mac OSX, Cygwin on Windows) でサポートされているので、システム依存なく運用するには便利です。
このページには、主に私のレシピの中から、Tips に近いものを紹介しています。詳しい解説などは、リンクを辿って下さい。
Default の設定だと、home directory に、.procmailrc が置かれるのだけれど、関 連するファイルが増えて、複雑になってくると、管理が大変なので、~/.procmail というフォルダを作って、そこに纏めてしまいます。
で、最低限の設定を書いた、.procmailrc をホームにおいて、そこから、~/.procmail/ 以下の設定ファイルを適宜読み込ませます。こうする事によって、
事になって、大分見通しが良くなります。
ホームに置く、.procmailrc は、これ。
# --------------------------------------
# 全体的な設定
# --------------------------------------
## パスの設定
VERBOSE=off
PATH=/usr/bin:/bin:/usr/local/bin:.
## procmail 用の環境変数を、環境別に設定
INCLUDERC=.procmail/.homerc # .homerc は、~/.procmail/ に置いておくが、
# cygwin の場合、/cygdrive/c/Documents and
# Setteings/$user/ に、シンボリックリンクを
# 張っておく必要有り。
## ~/.procmail/.procmailrc に制御を渡す
SWITCHRC=.procmail/.procmailrc
実質的にパスの設定だけ。
環境の差を吸収する為の、~/.procmail/.homerc を読み込んで、実質的なレシピの書いてある、~/.procmail/.procmailrc に制御を渡してます。
<BR>~/.procmail/.homerc だけを、環境(マシンや場所)に応じて、複数持っておけば、他のファイルは同じ物を使える。私の場合、
で、全部同じです。例えば、会社の Windows2000 用の .homerc はこんな感じ。
# -------------------------------------- # procmail 用の環境変数を、環境別に設定 # -------------------------------------- ROOT=d:/cygwin HOMEDIR=/home/hogehoge
~/.procmail/.procmailrc の先頭はこれ。
# -------------------------------------- # 環境設定 # -------------------------------------- ## 一般的な環境設定 HOME=$ROOT$HOMEDIR MAILDIR=$HOMEDIR/Mail DEFAULT=$HOMEDIR/Mail LOGFILE=$HOMEDIR/.mail/log LOCKFILE=$HOMEDIR/.lockmail ## サブルーチン用 PROCMAIL=$HOME/.procmail ## debug の為 VERBOSE=on
Virus は、ClamAVで、判定して、有無を言わさず、専用フォルダーへ。 題名だけ確認したら。即効で消去。
# -------------------------------------- # ClamAntivirus で、Virus をはじく # -------------------------------------- :0 HB * ! ? clamdscan -m --quiet - virus/.
Virus をはじいた後は、取り敢えずバックアップを。
最初の頃は、無茶苦茶なレシピを書いて、メールが行方不明になる事も。この、バックアップフォルダーで大分助けられました。
又、メール用フォルダーは、別ディスクにして、~/Mail にシンボリックリンクしてるんですが、何かの不調で其のディスクがマウントされてない事に気付かずにいたら、大量にメールが行方不明になりました。この時も、ここからレスキューしました。
このフォルダーだけは、ホーム直下に直接置いてあります。一ヶ月ほどで、消去してます。
# -------------------------------------- # 万が一レシピがこけた時の為のバックアップ # -------------------------------------- :0 c * $HOMEDIR/Mail.backup/inbox.backup/.
です。bogofilter-nihongo.rb は、東京工科大の冨永先生のページで紹介されている、prepare.rb を改造して使わせて頂いてます。インストールや構造等はこちら。
が、次のように、一度環境変数に代入して、フィルター処理で、formail を使うと出来ると、此方のページに書いてありました。素晴らしい。
<BR># -------------------------------------- # bogofilter の、spamicity を、ヘッダ X-bogosity として挿入 # -------------------------------------- ## bogofilter で、spamicity を計算し、SPAMISITY に代入 SPAMICITY=`~/bin/bogofilter-nihongo.rb -TT --unicode=no -k 10` ## X-Bogosity を、ヘッダーに挿入 :0 fh * | /usr/bin/formail -fI "X-Bogosity: spamicity=$SPAMICITY"<br>
Bogofilter のデフォルトは、spamicity=0.99 で、SPAM 判定しているのだけれど、これだと厳しすぎて、却って
ので、次のようにしてます。
これを決めた経緯は、こちらに紹介しています。
## spam の判定基準を設定 SPAM= (1\\.|0\\.9) MOSTLY= (0\\.[7-8]|0\\.6[7-9]) UNSURE= (0\\.4[5-9]|0\\.5|0\\.6[0-6]) HAM= (0\\.[0-3]|0\\.4[0-4])
# --------------------------------------
# spam を、Spamicity に従って振り分けるルーチン
# --------------------------------------
:0 HB
* ^X-Bogosity: spamicity=*\/.*
{
:0
* $MATCH ?? $SPAM
spam/.
:0 HB
* $MATCH ?? $MOSTLY
spam067/.
:0 HB
* $MATCH ?? $UNSURE
inbox/.
}
<BR>
# -------------------------------------- # Mail を、spamicity に従って振り分ける、サブルーチン(.spamrc)を呼び出す # -------------------------------------- INCLUDERC=$PROCMAIL/.spamrc
素の procmail の侭では、日本語Subject による、振り分けが出来ないので、いろいろ工夫して、次のようにしてます。
したものを、DECODED_SUBJECT に代入。
# --------------------------------------
# 日本語Subject を、整形して取り込む
# --------------------------------------
## nkf, sed で、mime decode 整形して、DECODED_SUBJECT へ代入
:0
* ^Subject:.*\/.*
{
DECODED_SUBJECT=$MATCH
:0 h
* ^Subject:.*=\?ISO-2022-JP\?B\?.*\?=
DECODED_SUBJECT=|echo "$MATCH"|nkf -meZ1|sed 's/[[:space:]]//g'
}
<BR>
そして、DECODED_SUBJECT を使って、判別&振り分けを次のように実施しています。
## Subject が mime encode されている場合も、されていない場合も、条件が合えば ## hoge folder に振り分ける。 :0 * $DECODED_SUBJECT ?? .*hogehoge.*|.*ほげほげ.*|.*ホゲホゲ.*|.*HGHG.*|.*穂下穂下.* hoge/.<BR>
これだと、hogehoge、hogehoge、ほげほげ、ホゲホゲ、HGHG、HGHG、穂下穂下なんてのが全部引っかかります。中々便利です。
私の、.procmailrc には、こういうのが、100個位並んでたりします。
尚、このレシピは、北陸先端大の藤田さんのページでも、紹介して頂いています。
私の場合、レシピの先頭に、これを挿入しています。
## -*- mode: procmail; coding: euc-japan-unix -*-
お呪いみたいなもんですが、色んなシステム上で、編集していると、何時の間にか、coding-system や、改行コードが変わってしまっていて、痛い目にあったことが有りますので。
多少でも、編集しやすくする為に、使わせて頂いてます。
.procmailrc もちょっとレシピが増えると、直ぐ1000行を超えます。procmail のスペック上、中々構造的に書きにくいのですが、多少でも、見通しを良くする為に、これをレシピの末尾に挿入しています。 こちらで教えて頂きました。
###### Local Variables: ###### mode: outline-minor ###### outline-regexp: "#+" ###### End:
私は、MUA として、emacsen で動く、Wanderlust を使っています。Wanderlust も、内部に、メール振り分けルーチンを持っていますが、procmail と二重に持ちたくないので、私は、wanderlust から、procmail を呼び出して使っています。
M-x wl-summary-pipe-message ("|" にバインドされてます)
procmail -m ~/.procmailrc
とすれば、良いです。複数のメールを同時に処理したい場合は、
M-x wl-summary-target-mark-pipe ("m |" にバインドされてます)
procmail -m ~/.procmailrc
です。この機能を使うと、手軽にレシピのテストが出来ます。