駄文。

プログラマーの日常でつまずいたこと・気づいたことなどの記録です

メール振り分けのためにprocmailを見直してみた

メール振り分けでサーバ側にprocmailを導入している。 というか、相当昔に試しで入れたままになっていた。

当時はネットで調べた情報を適当に設定したのでprocmailの動作を理解していたわけではなかった。

ただやりたかった指定アドレスから来たメールを別メールアドレスに転送するためにだけ使っていたが 今回、うるさいスパムを直接読み捨てたり、指定のメールボックスに転送すべくしっかり調べてみた。

いやぁ、よく考えられていますね。 今更ながら、もうちょっと調べて使いこなせていればと思う次第。

ということで今回調べた範囲をメモがわりに残しておく。

基本のフォーマット

PATH=$HOME/bin:/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$MAILDIR/procmail.log

# 転送すべき送信元リストを定義したファイル
LIST=$HOME/.whitelist-mail

# コメント
:0
*$ ? test -s $LIST
* ? (formail -x From: -x Reply-To: -x Sender: -x Return-Path: -x From | egrep -iqf $LIST)
 ! foo@example.com bar@example.com
 
 :0
* ^X-Senderauth-Result:.*fail
  .Junk/

条件部の制御フラグ

  • $ : シェルコマンドを実行する
  • ? : コマンドの復帰コードで判定 0: OK 0以外: fail

配信先の制御

  1. sendmailを使って別ユーザに転送

    • 先頭に !をつけて宛先を定義する。
    • スペース区切りで複数アドレスに転送可能

    ! foo@example.com

  2. MailDir型の別のフォルダに振り分ける

    • /で終端させる
    • 一般的にフォルダ名の先頭は.で始まる(メールアプリには先頭の.は削除されて表示されます)
    • Maildir特有の処理として 指定フォルダのtmpに配送後、newフォルダに移動されます

    .フォルダ名/

  3. MH形式に振り分ける

    • フォルダ名の最後に.をつける
    • フォルダ内のファイルをナンバリングして保存

    フォルダ名/.

  4. Mailboxに振り分ける

    • ファイルへのパスを記述
    • ファイルをロックする必要があるので先頭の:0にロック指定フラグの :を追加する
   :0 :
   * ^X-Senderauth-Result:.*fail
   Junk
  1. コマンドを実行する

    |で始める(つまりパイプで処理する)

    | grep foo

    実際には標準出力に結果が出されるだけなので役に立っていないが 本来は、役に立つコマンドを指定する

  2. 読み捨てる

    /dev/nullを指定する

    /dev/null

  3. 入れ子でフィルタ処理を行う

    {}で囲って処理を記述する

     :0 #指定されたファイルを添付して自動返信する。
     * ^Subject: foo.*
     {
         :0 
         * ^X-Senderauth-Result:.*pass
         passed/
    
         :0 
         * ^X-Senderauth-Result:.*fail
         .Junk/
     }
    

参考URLs

linuxjm.osdn.jp

linux.kororo.jp

qiita.com