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 を置かなくても大丈夫です。
とまあ、バーチャルメールアドレスでも振り分けしたくて頑張った結果がこれです(笑)。個人的にはちゃんとうまくいってい(るように見え)るので、気に入っているのですが、まあ何か問題が無きにしも非ず。何か問題を発見された方、「こんな方法もあるよ!」という方は是非ご一報を!(笑)
まさにこれがしたかったです。
評価が3なのは押し間違いです。
もちろん5です!
貴方様のおかげで私も条件メールが送れるようになりました。
有難うございました。
To: fukui_hitoshi さん
評価およびコメントありがとうございます。また、この記事がお役にたったようで何よりです。
この設定で動かして半年以上経ちましたが、特に問題は起きていません。
しかし、他にも何か方法があるのではと調べたところ、どうやら SWITCHRC や INCLUDERC というものがあるようで、まだ検証はしていないですが、それらを利用してもこの機能が実現できそうな気がします。例えば、この記事だと以下のようになると思います。
SWITCHRC=$MAILDIR/.procmailrc
これだと、パスにファイルがない場合はログにエラーが記録されるようですが、以降の処理は継続されるようです。
検証して、いずれ記事にしたいと思います。
参考までに以下 Manpage の URL です。
http://linuxjm.sourceforge.jp/html/procmail/man5/procmailrc.5.html
あたがわさま
ご回答ありがとうございました。
貴重な情報まで。
SWITCHRCはまだ発展途上の技術見たいですが、今後の情報に期待しております。
教えていただいたPROCの方は会社で大事に運用していきます。
有難うございました。
実際の運用を開始しましたら、自ドメイン宛のCCや、1メールに対する2個目3個目の宛先(複数宛先)について、いずれか一つの宛先にしか配信されないという事象が発生しました。
etc/procの書き方に依存していると思いますが、Maildirにprocがあればという条件以外に1メール複数の自ドメイン宛メールを各ボックスに転送するにはどうすればよろしいでしょうか?
現在外部宛は複数宛先でも送信できていますので、自分自身の各メールボックスに振り分けが出来れば
良いと考えております。
ご教示いただけますと幸いです。
よろしくお願いします。
To: fukui_hitoshi さん
コメント、情報提供ありがとうございます。
こちらでも確認したところ、確かに同じサーバに収容されてるアドレス宛だとどれか一つにしか届かないですね。
Postfix のログを確認したところ、ちゃんと 2 回 procmail を叩いているようなので、ロックファイルの問題かなと思いいろいろいじってみたのですが、そう簡単にはいきませんでした(笑)。次は SWITCHRC を試してみようと思います。
自己解決しました。
main.cfに
procmail_destination_recipient_kimit = 1
を書けば、そのまま複数受信が出来ます。
Postfixのmain.cfに
procmail_destination_recipient_limit = 1
を追記しないと、同じバーチャルドメイン宛の複数の受信者を指定したメールを送る処理が正常に行われません。
To: fukui さん
情報提供ありがとうございます。
そのような設定項目があったのですね。
私も試してみようと思います。
ありがとうございます。
まさにやろうとしていたことで大変参考になります。
質問させてください。
・procmailrcの記述中の
1)PATH=/usr/bin:/b
この後半の:/bとは何かの意味があるのでしょうか?
2)MAILDIR=/home/mailuser/$DOMAIN/$USER
この$DOMAINと$USERは、どこかで事前に定義されているものなのでしょうか?それとも私の環境用に書き換えるという認識でよろしいでしょうか?
$DOMAINは1つなので書き換えるのは問題ないのですが、$USERは多数いるため、$USERがワイルドカード的に使えるのであれば便利かなと思っております。$DOMAIN, $USERは2つともこのままの記述を使えば、任意のヴァーチャルドメインの任意のユーザーに対して有効というものなのでしょうか?
どうぞよろしくお願い致します。
To: yamaoka さん
コメントありがとうございます.
1) の件についてですが, PATH は procmail の場所を示すので,どう考えてもおかしいですね.私の環境では /usr/bin に procmail があり,正常に動作していたため気が付きませんでした.恥ずかしながら,当時は意味もあまり理解せずコピペでやっていたので,こういうミスが発生したのだと思われます.つまり, :/b は必要ありません(もしくは他のパスを : で区切って記述します).
2) の件についてですが, $USER と $DOMAIN は procmail が動くたびに,そのユーザについての情報が入ります.よって,このままの記述で任意のバーチャルドメインの任意のユーザのディレクトリを指していることになります.
ご丁寧にありがとうございます!
両点とも理解できました。参考にさせて頂きたいと思います。
ありがとうございました。
ピンバック: Procmail(Postfix + Virtual Host/Domain)で迷惑メールをフィルタする | abeerforyou.com
ピンバック: postfix とdovecot (SMTP Auth) でvirtual その7(postfix とprocmail) – SeedsLight