いつも procmail のレシピの書き方の細かい部分を忘れるのでメモ.
:0c
* ^TO_myn@a.example.org
! myn@c.example.org
:0c
* ^TO_.*@b.example.org
! myn@c.example.orgこれでmyn@a.example.org宛のメール,もしくはドメイン@b.example.org宛のメールだったら,ローカル配送とともにmyn@c.example.orgに転送される.
- レシピは:0ではじまって,次の:0かファイル終端で終わる(0に特に意味はない.:n(nはcondition line数)のようなformatにするつもりだったらしい.
- *で始まる行に条件(通常は正規表現; egrep)を記述(condition line).
- この例では!の行が action line (1つのレシピに1つ)
レシピの開始
- :0 [flags] [ : [locallockfile] ]というフォーマット.
- ここでflag cは carbon copy を作成する意味- 通常は match した時点で actition line で記述された処理を行なって procmail が終了するが,cが指定された場合は引き続く行も評価される
- 条件にマッチしない場合はローカル配送されるので,この例ではローカル配送と他のアドレスへの転送が行われる
- 転送の条件毎にレシピを用意する場合,複数の条件にマッチすれば複数回の転送が発生
 
- 通常は match した時点で actition line で記述された処理を行なって procmail が終了するが,
- :0:や- :0c:などの場合は lock が利用される(procmailは同時に複数立ち上がる可能性があり,同一のファイルに書き込みが行われる場合にはこの機能を用いる).- 手元では複雑なことをしていなくて,転送とmaildirでの保存のみなので,lock を使っていない(これで問題になったことはない).
 
- c以外では,- fwが SpamAssassin でフィルタ処理する等で用いられる- f: パイプ(ここでは省略)をフィルタ(処理されたメッセージを以降のレシピに渡す)として用いる.
- w: フィルタの処理を待ち,その exitcode をチェックする(異常終了していればそこで終わる; Default は exitcode を無視する).
 
Condition line
- condition line にマッチすると action line が実行される.
- 複数の条件を書ける(AND).条件なしの場合は true と解釈される.
- *の直後,行末の whitespace は無視される.
- 「通常は正規表現」だが,* < 2000000は,メールサイズが 2000000 byte 未満と解釈される
- Defailt は case-insensitive.Case sensitive にするには Dflag を用いる.
- ^TO_は以下に置換される(- ^TOは古い書き方で通常は- ^TO_でOK).To: だけでなく Cc: 等にもマッチさせるためのマクロ.- ^TO_:- (^((Original-)?(Resent-)?(To|Cc|Bcc)|(X-Envelope|Apparently(-Resent)?)-To):(.*[^-a-zA-Z0-9_.])?)
- ^TO:- (^((Original-)?(Resent-)?(To|Cc|Bcc)|(X-Envelope|Apparently(-Resent)?)-To):(.*[^a-zA-Z])?)
 
Action line
- !は転送の意味で,続くメールアドレスに転送される(変数- SENDMAILにより通常は- sendmailに送られる).
- directory 名を書くと,そこに保存される
- /で終わっていいれば maildir 形式,
- /.で終わっていいれば MH 形式.
- directory が存在しなければ作成される.
 
- file 名を書くと,そこに保存される(追記される)
参考:
- http://www.jaist.ac.jp/~fjt/procmail.html
- man procmailrc