Postfix + MySQL 環境で Procmail

Postfix + MySQL のバーチャルドメイン(バーチャルメールアドレス?ボックス?)の環境で、それぞれのアドレスのディレクトリに .procmailrc を配置して振り分けを行いたくて、いろいろやったところ、まあ一応できるといった感じです。

これが実際に動いたのは CentOS 5.6, CentOS 5.7, Scientific Linux 6.1 です。メール用のユーザが mailuser で、メール用のディレクトリは、メールアドレスが john@example.com だとすると、 /home/mailuser/example.com/john/ みたいな配置になってます。

それではまず、 procmail のインストールから。

yum -y install procmail


インストールしたら設定ファイルの変更、追加を。それぞれの行番号は関係ありません(見やすいように SyntaxHighlighter を使ってます)。

/etc/postfix/main.cf

#virtual_transport = virtual
virtual_transport = procmail

main.cf の virtual_transport を変更。

/etc/postfix/master.cf

procmail  unix  -       n       n       -       -       pipe
  flags=R user=mailuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

master.cf に上を追加。

/etc/procmailrc

SHELL=/bin/bash
PATH=/usr/bin:/b
MAILDIR=/home/mailuser/$DOMAIN/$USER
DEFAULT=$MAILDIR/
LOCKFILE=/home/mailuser/procmail.lock
LOGFILE=/home/mailuser/procmail.log
#VERBOSE=ON

:0
* ? test -e "$MAILDIR/.procmailrc"
| /usr/bin/procmail -t -m USER=$USER DOMAIN=$DOMAIN $MAILDIR/.procmailrc

どのメールアドレスにメールが届いても実行されるレシピが /etc/procmailrc で、本来はここにいろいろ書くわけですが、ここで各バーチャルアドレスのディレクトリに .procmailrc が存在していたらそのレシピを実行する感じにしました。

/home/mailuser/example.com/john/.procmailrc

SHELL=/bin/bash
PATH=/usr/bin:/b
MAILDIR=/home/mailuser/$DOMAIN/$USER
DEFAULT=$MAILDIR/
LOCKFILE=$MAILDIR/procmail.lock
LOGFILE=$MAILDIR/procmail.log
#VERBOSE=ON

(お好きなレシピを)

そして、バーチャルなメールアドレスのディレクトリに .procmailrc を書けばうまいこと振り分けられるというわけです。振り分けいらないなら .procmailrc を置かなくても大丈夫です。

とまあ、バーチャルメールアドレスでも振り分けしたくて頑張った結果がこれです(笑)。個人的にはちゃんとうまくいってい(るように見え)るので、気に入っているのですが、まあ何か問題が無きにしも非ず。何か問題を発見された方、「こんな方法もあるよ!」という方は是非ご一報を!(笑)


Postfix + MySQL 環境で Procmail」への11件のフィードバック

  1. fukui_hitoshi

    まさにこれがしたかったです。
    評価が3なのは押し間違いです。
    もちろん5です!
    貴方様のおかげで私も条件メールが送れるようになりました。

    有難うございました。

  2. あたがわ 投稿作成者

    To: fukui_hitoshi さん
    評価およびコメントありがとうございます。また、この記事がお役にたったようで何よりです。
    この設定で動かして半年以上経ちましたが、特に問題は起きていません。
    しかし、他にも何か方法があるのではと調べたところ、どうやら SWITCHRC や INCLUDERC というものがあるようで、まだ検証はしていないですが、それらを利用してもこの機能が実現できそうな気がします。例えば、この記事だと以下のようになると思います。

    SWITCHRC=$MAILDIR/.procmailrc

    これだと、パスにファイルがない場合はログにエラーが記録されるようですが、以降の処理は継続されるようです。
    検証して、いずれ記事にしたいと思います。
    参考までに以下 Manpage の URL です。
    http://linuxjm.sourceforge.jp/html/procmail/man5/procmailrc.5.html

  3. fukui_hitoshi

    あたがわさま
    ご回答ありがとうございました。
    貴重な情報まで。
    SWITCHRCはまだ発展途上の技術見たいですが、今後の情報に期待しております。
    教えていただいたPROCの方は会社で大事に運用していきます。

    有難うございました。

  4. fukui

    実際の運用を開始しましたら、自ドメイン宛のCCや、1メールに対する2個目3個目の宛先(複数宛先)について、いずれか一つの宛先にしか配信されないという事象が発生しました。
    etc/procの書き方に依存していると思いますが、Maildirにprocがあればという条件以外に1メール複数の自ドメイン宛メールを各ボックスに転送するにはどうすればよろしいでしょうか?
    現在外部宛は複数宛先でも送信できていますので、自分自身の各メールボックスに振り分けが出来れば
    良いと考えております。
    ご教示いただけますと幸いです。
    よろしくお願いします。

  5. あたがわ 投稿作成者

    To: fukui_hitoshi さん
    コメント、情報提供ありがとうございます。
    こちらでも確認したところ、確かに同じサーバに収容されてるアドレス宛だとどれか一つにしか届かないですね。
    Postfix のログを確認したところ、ちゃんと 2 回 procmail を叩いているようなので、ロックファイルの問題かなと思いいろいろいじってみたのですが、そう簡単にはいきませんでした(笑)。次は SWITCHRC を試してみようと思います。

  6. fukui

    自己解決しました。
    main.cfに
    procmail_destination_recipient_kimit = 1
    を書けば、そのまま複数受信が出来ます。

    Postfixのmain.cfに

    procmail_destination_recipient_limit = 1

    を追記しないと、同じバーチャルドメイン宛の複数の受信者を指定したメールを送る処理が正常に行われません。

  7. あたがわ 投稿作成者

    To: fukui さん
    情報提供ありがとうございます。
    そのような設定項目があったのですね。
    私も試してみようと思います。
    ありがとうございます。

  8. yamaoka

    まさにやろうとしていたことで大変参考になります。
    質問させてください。

    ・procmailrcの記述中の

    1)PATH=/usr/bin:/b
    この後半の:/bとは何かの意味があるのでしょうか?

    2)MAILDIR=/home/mailuser/$DOMAIN/$USER
    この$DOMAINと$USERは、どこかで事前に定義されているものなのでしょうか?それとも私の環境用に書き換えるという認識でよろしいでしょうか?
    $DOMAINは1つなので書き換えるのは問題ないのですが、$USERは多数いるため、$USERがワイルドカード的に使えるのであれば便利かなと思っております。$DOMAIN, $USERは2つともこのままの記述を使えば、任意のヴァーチャルドメインの任意のユーザーに対して有効というものなのでしょうか?

    どうぞよろしくお願い致します。

  9. あたがわ 投稿作成者

    To: yamaoka さん
    コメントありがとうございます.

    1) の件についてですが, PATH は procmail の場所を示すので,どう考えてもおかしいですね.私の環境では /usr/bin に procmail があり,正常に動作していたため気が付きませんでした.恥ずかしながら,当時は意味もあまり理解せずコピペでやっていたので,こういうミスが発生したのだと思われます.つまり, :/b は必要ありません(もしくは他のパスを : で区切って記述します).

    2) の件についてですが, $USER と $DOMAIN は procmail が動くたびに,そのユーザについての情報が入ります.よって,このままの記述で任意のバーチャルドメインの任意のユーザのディレクトリを指していることになります.

  10. yamaoka

    ご丁寧にありがとうございます!
    両点とも理解できました。参考にさせて頂きたいと思います。
    ありがとうございました。

  11. ピンバック: Procmail(Postfix + Virtual Host/Domain)で迷惑メールをフィルタする | abeerforyou.com

コメントを残す

メールアドレスが公開されることはありません。