いつも 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 にするには
D
flag を用いる. ^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