Procmail

最終更新日時:2009-03-31 11:09:46
メール関連

Procmail とは


Procmail は、メールを様々な条件によって振り分けたり、コマンドにパイプ渡ししたりすることを可能にするアプリケーションです。
メールの自動保存や SPAM のフィルタリング等に威力を発揮します。

インストール


procmail-3.15.2 の例です。

Procmail Homepageから最新のアーカイブを取得し、展開します。

 % gzip -dc procmail-3.15.2.tar.gz | tar xvf -
 % cd procmail-3.15.2


展開したらまず、Makefile, config.h を環境に合わせて修正します。
例えば、インストール先を /usr/local/bin にしたいのであれば以下を修正します。

 BASENAME = /usr/local


修正が終わったら以下のようにしてインストールします。

 % make
 % su
 # make install
 # make install-suid


設定


.forward と .procmailrc を設定します。
これらの編集中にメールを受信してしまうとメールをロストしてしまう可能性があるので、必ずメールを受信しない状況にて編集する必要があります。

.forward の設定


以下のように $HOME/.forward を設定することにより、受信したメールを Procmail に適用するようにします。

 \koumei2, "|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #koumei2"


※ koumei2 はログイン名

上記の設定で、「\koumei2」と「"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #koumei2"」の2つの転送先を指定したことになります。
最初の「\koumei2」は特殊な指定方法で、頭に「\」がつくと、これ以上転送させずに koumei2 ユーザーにメールを格納するという指定になります。
つまり、ローカルサーバの通常のメールスプールにメールが溜まることになります。
そして、後半の「|IFS=' '...」の方ですが、この設定により Procmail にメールが渡るようになります。

.procmailrc の設定


Procmail はデフォルトで $HOME/.procmailrc の設定を読み込んで実行するので、$HOME/.procmailrc を作成します。
.procmailrc は非常に多くの設定可能な項目があるのでここではごく一部を紹介することにします。

 PATH=$HOME/bin:/usr/bin:/bin:/usr/local/bin
 MAILDIR=$HOME/mbox
 DEFAULT=/var/spool/mail/koumei2
 LOGFILE=$HOME/logs/procmail_`date +%Y%m`.log
 LOCKFILE=$HOME/.lockmail
 #VERBOSE=on
 
 :0
 * ^TOlinux-users@linux.or.jp
 {
    :0 c
    $HOME/mbox/linux-users/current/.
 
    :0 c
    | $MHONARC -rcfile $RCFILE -add -outdir $HOME/html/linux-users/current
 
    :0
    $DEFAULT
 }
 
 :0BHD
 * 9876543210^0 easygame.co.in
 * 9876543210^0 rlqt.com
 * 9876543210^0 4diamonds19
 /dev/null


上記の設定で $HOME/mbox/linux-users/current の下に MH 形式(1メールにつき数字名のファイルが1つ)のメールファイルが出来、さらに MHonArc で変換した結果が $HOME/html/linux-users/current の下に作成され、/var/spool/mail/koumei2 にメールが保存されます(通常のメール受信)。
:0 から始まる一連の設定はレシピと呼ばれ、レシピはいくつでも設定可能で、構文は以下の通りとなっています。

 :0 [ flags ]
 * [ 条件 ]
 処理


また、上記の例のように「{...}」で囲むことによりレシピはネストすることが可能です。
「条件」を満たしたメールは「処理」を行い、破棄されます。
ただし、:0 c の「 c 」は、コピーの「 c 」で、この場合は条件を満たして処理を行った場合にも破棄されず、次のレシピへ渡されます。
通常、「条件」は正規表現で指定しますが、Procmail 特有の表現方法として「 ^TOlinux-users@linux.or.jp 」は、To: Cc: Bcc: のいずれかが「 linux-users@linux.or.jp 」であるという意味となり、ML のメール等を振り分けるのに非常に便利です。
:0 の後にはオプションを指定することが出来、例えば上記の2番目のレシピの例では、B はメール本体(body)をチェック、H はメールヘッダをチェックを意味します。
デフォルトではヘッダのみチェックなので、本体もチェック対象とする場合には BH と指定する必要があります。
また、B のみ指定だとヘッダはチェックされません。
D はチェックの際に大文字小文字を区別する(デフォルトでは区別しない)という意味となります。
2番目のレシピの条件の 9876543210^0 は Procmail のスコア機能を利用して条件を OR 指定する記述方法です。

「処理」に指定できる記述のうち代表的なものを以下に挙げます。

ファイル名指定されたファイルにメールを保存します。既にファイルが存在する場合には追記します。
ディレクトリ名ユニークなファイル名を付けて指定したディレクトリ以下に保存します。
ディレクトリ名/上記と同様ですが、ファイル名は連番となります。
! メールアドレス指定されたメールアドレスに転送します。カンマで区切ることにより複数アドレスに転送可能です。
| コマンドパイプで他のコマンドに渡します。
{}複数の処理を実行する場合や、さらに条件で絞り込む際にブロック指定します。


例の場合、メールヘッダに easygame.co.in もしくは rlqt.com もしくは 4diamonds19 が含まれている際には /dev/null に捨てることを意味しています。

procmail はレシピによって振り分けた結果をログに出力することができます。
この設定が、LOGFILE です。
上記のように設定すると、年月別のログファイルに出力するようになります。

ちなみに、コメントしている「VERBOSE=on」をコメントアウトにするとデバッグ用のログが大量に出力されますので、レシピをテストする場合には有効かもしれません。

Suspicious rcfileエラーについて


比較的新しめのバージョンでは、Suspicious rcfile .procmailrcのようなエラーが出ることがあります。
このエラーは、以下のいずれかの状態になっている場合に、セキュリティ的に疑わしいのでrcfileは使用できないという理由で発生するようです。

・rcfile のownerが、受取人もしくはrootではない
・rcfileが誰でも書き込み可能
・rcfileがあるディレクトリが誰でも書き込み可能
・rcfileがデフォルトのrcfile($HOME/.procmailrc)で、グループ書き込み可能
・rcfileがデフォルトのrcfile($HOME/.procmailrc)で、rcfileがあるディレクトリがグループ書き込み可能


お問い合わせは 掲示板 にて。