PROCMAIL(1) | General Commands Manual | PROCMAIL(1) |
procmail - 自律型メールプロセッサ
procmail [-ptoY] [-f fromwhom]
[parameter=value | rcfile] ...
procmail [-toY] [-f fromwhom] [-a
argument] ... -d recipient ...
procmail [-ptY] -m [parameter=value]
... rcfile [argument] ....br procmail -v
取り敢えずすぐ始めたい場合は、後の 備考 を参照されたい。
procmail は、メールの到着後 .forward ファイルの仕組みを通じてただちに自動起動されるだろう。 あるいは、システム管理者がインストールした場合は、 メーラ内部から直接起動されることもある (訳注: 原文は mailer と書かれているが、ここでは MUA ではなく MTA を指しているものと推測する)。 procmail は起動すると、まずいくつかの環境変数をデフォルト値に設定する。 それから EOF (End Of File; ファイルの終端) に行き当たるまで、 標準入力からメールメッセージを読み込み、ヘッダーと本文を分離する。 その後、コマンドラインに引数が指定されていなければ、 $HOME/.procmailrc という名前のファイルを探し始める。 このファイル内の処理レシピに従って、到着したメールメッセージは適切なフォルダ (及びその他) に配送される。 もし rcfile が見つからないか、 rcfile の処理が終わったら、 procmail は メールをシステムのデフォルトのメールボックスに保存する。
rcfile が存在せず、さらにコマンドラインに -p も指定されていない場合、 /etc/procmailrc ファイルが存在すれば、procmail は $HOME/.procmailrc を読み込む前に、 このファイルに書かれているコマンドを解釈する。 /etc/procmailrc を作成するときは十分に注意を払わなければならない。 なぜなら、状況によっては、このファイルの解釈は root 権限で 実行される場合がありえるからである (もちろん $HOME/.procmailrc の場合はそのようなことはない)
procmail は、 suid root されているか、或は root 権限で動作している場合、 機能拡張され、下位互換性のあるメール配送エージェントとして動作できるようになる。
また、procmail は汎用のメールフィルタとしても使える。 つまり、(元々は一般的な目的のメールフィルタだったが) 特別な sendmail のルールを使用して procmail を実行できるようにする仕組みが 設けられたのである。
rcfile のフォーマットは procmailrc(5) マニュアルページで詳細に解説されている。
重みつきスコアリング手法については procmailsc(5) に詳しい説明がある。
rcfile のレシピの例は
procmailex(5)
マニュアルページを参照されたい。
その他の引数はすべて rcfile のパスと見なされる。 (このパスは絶対パスか、または `./' で始まっていれば 現在のディレクトリからの相対パスのいずれかである。 その他のすべての相対 パスは、 -m オプションを使用しない限り $HOME からの相対パスである。 -m オプションを使用した場合、すべての相対パスは現在のディレクトリからの 相対パスとなる。) そして procmail は、コマンドラインで最初に見つかった rcfile を使用して 起動する。 先行する引数に指定されている rcfile に合致する HOST 指示 (HOST-directive) を有しない場合、または引数が 存在しない場合にのみ、コマンドライン上にて次に指定されている rcfile が 一つだけ解析される。
rcfile
を何も指定しない場合は
$HOME/.procmailrc を検索する。
rcfile
が見つからなくても、環境変数のデフォルト設定と
コマンドラインで指定された値に従って処理を続行する。
rcfile のレシピの例は procmailex(5) のマニュアルページを参照されたい。 rcfile のちょっとしたサンプルは、後述する 備考 にを参照のこと。
sendmail.cf の文法を多少なりとも知っているシステム管理者以外は、 これ以降の「例」は読み飛ばして頂きたい。
-m オプションは、sendmail.cf ファイルのルールから procmail を呼び出す際に 使われるのが一般的である。このようにするには、自分の sendmail.cf ファイルに、 (procmail を立ち上げる `local' メーラはおそらく既に存在するだろうが、 それに加えて) `procmail' メーラを別途追加すると都合が良い。 このような `procmail' メーラを作成するには、次のようにすればいいだろう:
Mprocmail, P=/usr/bin/procmail, F=mSDFMhun, S=11, R=21,
A=procmail -m $h $g $u
こうすれば、 (大抵の場合 ruleset 0 にある) 以下のようなルールを使用して、 メールを procmail メーラを通じてフィルタできる。 (ただし、ルールを継続して記述するために行頭にタブがあることと、 コメントを分離するためにタブがあることに注意。)
R$*<@some.where>$*
$#procmail $@/etc/procmailrcs/some.rc $:$1@some.where.procmail$2 R$*<@$*.procmail>$*
$1<@$2>$3 Already filtered, map back
そして /etc/procmailrcs/some.rc は次のように簡単になる:
SENDER = "<$1>" # 空の送信者アドレスを修正 SHIFT = 1 # $@ から除去 :0 # 全てのゴミメールを放り込む * ^Subject:.*junk /dev/null :0 w # それ以外の全てのメールを通過させる ! -oi -f "$SENDER" "$@"
/etc/procmailrcs/some.rc
ファイルの中からメールを送信するときには
特に注意されたい。
最初のルールに合致するアドレスにメールを再度送信すると、メールの
無限ループを引き起こすことになる。
procmailrc(5), procmailsc(5), procmailex(5), sh(1), csh(1), mail(1), mailx(1), binmail(1), uucp(1), aliases(5), sendmail(8), egrep(1), grep(1), biff(1), comsat(8), lockfile(1), formail(1), cron(1)
VERBOSE 変数に値を設定すると、拡張診断機能を有効/無効にできる。
システムメールボックス以外の任意のメールボックスに対して自分のメールシェルを起動する場合は、その前に lockfile(1) を使用するシェルスクリプトを作成すること。 (もちろん、自分のメールシェルが (ローカルであるかグローバルであるかにかかわらず) rcfile で指定したロックファイルと同じものを使用している場合は別である。)
万が一 procmail を自身の正常終了前に絶対 kill しなければならない場合は、 まず最初に通常の kill コマンドを試してみること。 (つまり kill -9 ではない 。終了コードについては シグナル を参照のこと) さもないと、 ロックファイル がいくつか削除されない場合がある。
-t オプションは注意して使用すること。 (例えば rcfile に誤りがあるために) procmail が何度もメールの配送失敗を繰り返すと、システムのメールキューが 溢れる可能性がある。 こうなると、ローカルの postmaster と他のユーザの両方に迷惑をかけるだろう。
/etc/procmailrc ファイルは root 権限で実行される場合があるので、 このファイルに書き込む内容には十分に注意すること。 SHELL は現在の受取人のシェルと同じになるため、 procmail でシェルを起動する 必要がある場合は、最初にこの変数を何らかの無難な値に設定しておくとよい。 DROPPRIVS も参照のこと。
/etc/procmailrcs/ にあるファイルに対して chown(1) が許可されていれば、そのファイルの現在の所有者は、そのファイルを rootにでも (他の誰にでも) chown できることを心に留めておくこと。 そこで、セキュリティを最大限強化するため、このディレクトリは 必ず root だけが 実行可能 であることを確認すること。
自分のドメイン宛ての全てのメールに対して
POP
アカウントが1つしかないような、
1つのメールボックスを複数のユーザが共有する場合、
procmail
は適切なツールではない。
使用している MTA
をどうにかして設定して、
そのメッセージの宛先を
procmail
に伝えるいくつかのヘッダを受取人データのエンベロープに追加すればそのような共有も可能になるだろう。
しかしこれは通常正しい行為ではない。
おそらく、その MTA
に「仮想ユーザテーブル」機能が備わっているかどうかを調べるか、
Fetchmail の `multidrop'
機能を調べる方がいい。
procmail は強制的にロックファイルを削除した後、 新しいロックファイルを作成する前に $SUSPEND 秒待つ。 これは、古くなったロックファイルを削除しようとする他のプロセスが、 新たに作成されたロックファイルを誤って削除しないようにする為である。
procmail は、暴走したフィルタを終了する為に通常の TERMINATE シグナルを使用する。 しかし、そのシグナルにフィルタが応答するかどうかは確認しない。 それに procmail がシグナルを送るのはそのフィルタ自体であり、 そのフィルタのどの子プロセスにもシグナルは送らない。
複数行に渡る、長過ぎる Content-Length: フィールドは正しく処理されない。
複数行に渡る一つのヘッダに含まれる改行は、
マッチングの際にはそれをそのまま1個の空白として扱うのではなく、
無視されるだろう。
メールヘッダに Content-Length: フィールドがあり、 -Y オプションが指定されていなければ、 procmail はそのフィールドに指定されているサイズを正しいサイズになるように調整する。 その際、 procmail は Content-Length: フィールドのフィールド幅を変更しない。
Content-Length: フィールドがない場合、または -Y オプションが指定されている状態で procmail が通常のメールフォルダに メールを追加する場合、メッセージ本文中で消印 (postmark) と間違えそうな 全ての行の行頭には `>' が追加され、これにより偽造メールヘッダを無害化する。 この消印は、以下の正規表現を用いて検索する。 (訳注: 消印 (postmark) はエンベロープ From を示す行のことである。 mbox 形式メールボックスにメッセージを配送する際には、 識別文字列 "From " と混同しないように、 本文中で行頭に "From" がある場合は、該当する全ての行の行頭に引用符 '>' を付加する。 なお、引用符の追加は MH フォルダ形式と maildir フォルダ形式では行われない。)
`\nFrom '
明示的配送モードで使用される配送先のユーザ名が /etc/passwd になければ、 procmail は明示的配送モードになっていなかったものとして処理を継続する。 明示的配送モードになっておらず、且つ実行中の procmail の uid に 対応する /etc/passwd エントリがない場合、HOME , LOGNAME , SHELL 及び ORGMAIL の各変数のデフォルト値は、それぞれ / , #uid , /bin/sh , /tmp/dead.letter になる。
明示的配送モードの時、メッセージヘッダの先頭に `From ' 行がない場合、procmail はこれを生成する。 `From '行が既にある場合は、 procmail はそれには手を付けずにそのまま残す。 procmail を起動したユーザのユーザ或はグループ ID が root, daemon, uucp, mail, x400, network, list, slist, lists or news のいずれでもなく、それでも新しい `From ' 行を生成ないし受け入れる 必要がある場合は、偽造メールと区別しやすくするために procmail は `>From ' 行を追加する。
セキュリティ上の理由から、 procmail が使用する rcfile は絶対パスか $HOME からの相対パス指定であり、且つその所有者が受取人または root であり、 且つ rcfile 自体とこれを含むディレクトリの両方共誰でも書き込みできる状態であってはならない (訳注: world writable: other (その他) の書き込みビット (w) が立っている状態を指す。 man chmod 参照。) 更に、$HOME/.procmailrc ファイルの場合は、同一グループユーザが書き込み可能であってはならないし、 また $HOME ディレクトリが同一グループから書き込み可能であってはならない。
/var/spool/mail/$LOGNAME が偽のメールボックスである (すなわち、メールボックスの所有者が受取人でないか、 メールボックスが書き込みできないか、メールボックスがシンボリックリンク或はハードリンクである) 場合、 procmail は起動時にそのメールボックスを `BOGUS.$LOGNAME.' で始まり、 inode-sequence-code で終わるファイル名に変更しようとする。 もしこれができないとわかると、 ORGMAIL には初期値が 設定されない。 結果として、適切な rcfile のない状態でメールの配送が行われなくなる。
/var/spool/mail/$LOGNAME は正規のメールボックスだが、 パーミッションが甘すぎる場合は、 procmail はこれを修正する。 procmail にこのようなパーミッション操作をさせないようにするには、 メールボックスに必ず u+x ビットを立てること。
メールをディレクトリ、MH フォルダ、または maildir フォルダに配送する際には、 procmail の複数起動による混乱を防ぐ為にロックファイルを使う必要は ない。
MH フォルダへの配送は、通常のディレクトリや mailbox への配送よりも若干の時間を 要する。 これは procmail が (すぐに使えるファイル名を採用しないで) MH フォルダ内で ファイル名として使える次の番号を検索しなければならないからである。
-t オプションが指定されていない限り、procmail は一般的な失敗に関して EX_CANTCREAT を返す。 -t オプションが指定されている場合には EX_TEMPFAIL を返す。
egrep 風のヘッダ検索をより良く行う為に、 procmail は複数行にわたる 全てのヘッダフィールドを連結して一行にする。 但し、これは内部的な処理であり、メールを配送する際には、 改行は元の状態に戻る。
(たとえば procmail が違う名前でリンクされていて、その違う名前で 起動される場合のように) 起動する procmail の名前が `procmail' で 始まっていない場合、その procmail は明示的配送モードで起動され、 (-d オプションが指定された時と同様に) コマンドラインの引数に 受取人名が必要になる。
Comsat/biff 通知は udp を使用して行われる。 この通知は、procmail が通常のログファイルのエントリを生成した時に 一回送出される。通知メッセージは下記の拡張フォーマット (または最後の配送先がファイル以外の時のフォーマットと酷似したもの) である:
$LOGNAME@offset_of_message_in_mailbox :absolute_path_to_mailbox
procmail がメールの配送の際にファイルを開く時は、 procmail は常に fcntl(2) によるカーネルロックの方法を使用する。
procmail は NFS
環境でも使用可能で、
8
ビット問題はない。(訳注:
8bit clean:
データの8ビット目を遮ることなく透過的にデータ転送を行えることを指す。)
procmail をコマンドラインオプション -h または -? にて起動すると、 コマンドラインヘルプとレシピフラグのクイックリファレンスのページが 表示される。
メールフィルタ(特に procmail)に関して、初心者向けに優れた FAQ がある: これは Nancy McGough <nancym@ii.com> が保守しており、 mail-server@rtfm.mit.edu に以下の内容の本文をメールすれば入手できる (訳注: http://www.faqs.org/faqs/mail/filtering-faq/ からも閲覧可能)。
send usenet/news.answers/mail/filtering-faq
もし procmail が当該ホストのデフォルトのメール配送エージェントとしてインストール されていなければ (システム管理者に問い合わせること)、自分宛のメールが到着した時に 起動されることを確認する必要がある。 この場合、自分の $HOME/.forward に以下の行を書いておくこと (このファイルは誰でも読み込み可能で なければならない ことに注意)。 その際、必ずシングルクォートとダブルクォートを含むこと。 さらに、自分のサイトで smrsh (the SendMail Restricted SHell) が動いている と分かっていれば別だが、そうでなければ、このパスは 絶対パス にすること。
" |exec /usr/bin/procmail"
procmail は、既に一杯になっているシステムメールボックスの 後処理にも使用できる。 $HOME/.forward ファイルを使いたくないとか、 使用できない場合にこれが役に立つ場合がある。 (この場合は以下のスクリプトを cron(1) から定期的に呼び出しても良いし、メールを読み始める際に必ず起動するようにしても良い。)
#!/bin/sh ORGMAIL=/var/spool/mail/$LOGNAME if cd $HOME &&
test -s $ORGMAIL &&
lockfile -r0 -l1024 .newmail.lock 2>/dev/null then
trap "rm -f .newmail.lock" 1 2 3 13 15
umask 077
lockfile -l1024 -ml
cat $ORGMAIL >>.newmail &&
cat /dev/null >$ORGMAIL
lockfile -mu
formail -s procmail <.newmail &&
rm -f .newmail
rm -f .newmail.lock fi exit 0
PATH=/usr/local/bin:/usr/bin:/bin MAILDIR=$HOME/Mail #you'd better make sure it exists DEFAULT=$MAILDIR/mbox #completely optional LOGFILE=$MAILDIR/from #recommended :0: * ^From.*berg from_me :0 * ^Subject:.*Flame /dev/null
その他の rcfile レシピの例は procmailex(5) マニュアルページを参照されたい。
このプログラムは procmail mail-processing-package (v3.22) の一部で あり、http://www.procmail.org/ または ftp.procmail.org の pub/procmail/ で入手できる。
procmail パッケージの全てのプログラムに関連した質問へのメーリングリストが ある:
<procmail-users@procmail.org>
質問/回答の投稿用アドレス。
参加申込用のアドレス。
新しいバージョンやオフィシャルパッチについての情報を常時入手したい場合
には、以下のメールアドレスに参加申込をすること:
procmail-announce-request@procmail.org
Stephen R. van den Berg
<srb@cuci.nl>
Philip A. Guenther
<guenther@sendmail.com>
2003/06/16 | BuGless |