仮想メールサーバの巻(?)、最後のネタになります。一服しようかとも思いましたが、そうすると二度と書かないような・・・(笑)。まぁ、こういうネタだと変なトラックバック残しそうな人が寄ってこなさそうなので、それはそれでいいかなと・・・?
メールの到着をトリガーにしてスクリプトを起動したいことってありますよね。今回は仮想メールサーバでそういうことするのはどうしたらいいの、ってお話です。っていうか、webプログラマが自分でメールサーバ用意しないとならないなんて理由があるとしたら、それしかないです。本来ならスクリプトを起動した後の動作からが守備範囲なわけですが、スクリプトを呼び出せるようになってるサーバ、そして希望の動作が仕組めるサーバって少ないですよね。そうなると、対応してるサーバから選ぶか、管理会社に対応するようお願いして済むものならそれで済みますが、そうでなければ自前で用意するしかないわけです。
今までもUNIXアカウントでは出来てましたよ。この場合は、
(1)まずはエイリアスの定義です。test@zonch.netにメールが来たら/・・・/script.phpというスクリプトを呼び出したい場合(・・・は適当なパス)、/etc/aliasesに
test: "|/・・・/script.php"
などと書きます、適当なエイリアス名と呼ばれるスクリプトをペアにして指定してやればいいわけです(newaliasesの実行を忘れずに)。ただ、testというのはUNIXアカウントですので、複数ドメインで運用している場合は、ドメインと一対一、つまりユーザーtest=test@zonch.netとは限らないわけです。そういう場合は、
(2)Postfixのバーチャルドメイン機能を使用して、etc/postfix/virtualにこう書きます。
zonch.net anything
test@zonch.net test
zonch.net anythingは必要らしいので、とりあえず入れます。次の行が、test@zonch.netに来たメールは、UNIXユーザーのtestに配信するという指定です。例えば、test以外の全てのzonch.net宛メールをtest2で受けたいなら、
zonch.net anything
test@zonch.net test
@zonch.net test2
なんて書きます。上から順に評価されてマッチするとそれ以上先には行かないので、test@zonch.netにマッチしなければ全て@zonch.netにマッチしてtest2に配送されます(postmap /etc/postfix/virtualとmain.cfのバーチャルドメイン設定を忘れずに)。
さて、仮想メールサーバでも同様な配送が出来るのかが、今回の最大のテーマだったわけですが、まずは参考ページの設定そのままで試してみます。前回までの設定で仮想アドレスには送受信できていたわけですが、まずはその設定のままでうまく行ったらラッキーなどという甘い考えで(笑)チャレンジ!・・・大方の予想通り、玉砕です。User Unknownだそうな。うむ、実にまっとうな動作。
どうしてよいかわからずしばらく検索&悩む日々。バーチャル設定にする前はうまく行っていたわけだから、変更前後で何が違うかログを眺めていると・・・
変更前は
relay=local
変更後は
relay=virtual
になってます。なるほど、そこで試しに他の設定は変えずに
local_transport = virtual → local_transport = local
にしてみると・・・relay=localとなってスクリプトが実行されました!!
virtual設定でもlocal配送になってくれさえすれば、スクリプトは呼び出せるわけですか。あっ、でもこの状態で仮想アドレス宛のメールを試してみると・・・メールが届きません。virtualにしたらlocalが、localにしたらvirtualが届かない・・これまたまっとうな動作で・・・いや、聞けば当たり前のようですが、これは何にもわからずやっている人間にとっては実に重要な作業です。動作がまっとうに思えるというのは、少しは理解が進んでるってことですから。
いろいろ調べてみると結局のところ、virtualなメールサーバにしようと思ったら、全てvirtualな配送になるってことらしいです。それじゃぁlocal配送しなければならないスクリプト起動はvirtualでは無理なのかってことになりますが、その場合は、virtualからlocalに流すことが出来るらしい。で、そのためのファイルが/etc/transportであることを発見。これには、配送がvirtualかlocalかの指定が出来るんです。中身はこんな感じ。
test@zonch.net local
こう書いておけばtest@zonch.net宛のメールはlocalとして配送されるので、virtual設定で今まで通りスクリプト起動が可能になります。ただし、このファイル、上から順に評価してマッチしたとこでストップするようなものではないので、例えば上で指定したような「それ以外全て」という様な処理は書けないことになります。希望の条件ごとにドメインを分けて、
@test.zonch.net local
などとし、test.zonch.netドメイン宛に送られたものはlocal配送などとして動作を分けるしかないと思います。
メールの到着をトリガーにしてスクリプトを起動したいことってありますよね。今回は仮想メールサーバでそういうことするのはどうしたらいいの、ってお話です。っていうか、webプログラマが自分でメールサーバ用意しないとならないなんて理由があるとしたら、それしかないです。本来ならスクリプトを起動した後の動作からが守備範囲なわけですが、スクリプトを呼び出せるようになってるサーバ、そして希望の動作が仕組めるサーバって少ないですよね。そうなると、対応してるサーバから選ぶか、管理会社に対応するようお願いして済むものならそれで済みますが、そうでなければ自前で用意するしかないわけです。
今までもUNIXアカウントでは出来てましたよ。この場合は、
(1)まずはエイリアスの定義です。test@zonch.netにメールが来たら/・・・/script.phpというスクリプトを呼び出したい場合(・・・は適当なパス)、/etc/aliasesに
test: "|/・・・/script.php"
などと書きます、適当なエイリアス名と呼ばれるスクリプトをペアにして指定してやればいいわけです(newaliasesの実行を忘れずに)。ただ、testというのはUNIXアカウントですので、複数ドメインで運用している場合は、ドメインと一対一、つまりユーザーtest=test@zonch.netとは限らないわけです。そういう場合は、
(2)Postfixのバーチャルドメイン機能を使用して、etc/postfix/virtualにこう書きます。
zonch.net anything
test@zonch.net test
zonch.net anythingは必要らしいので、とりあえず入れます。次の行が、test@zonch.netに来たメールは、UNIXユーザーのtestに配信するという指定です。例えば、test以外の全てのzonch.net宛メールをtest2で受けたいなら、
zonch.net anything
test@zonch.net test
@zonch.net test2
なんて書きます。上から順に評価されてマッチするとそれ以上先には行かないので、test@zonch.netにマッチしなければ全て@zonch.netにマッチしてtest2に配送されます(postmap /etc/postfix/virtualとmain.cfのバーチャルドメイン設定を忘れずに)。
さて、仮想メールサーバでも同様な配送が出来るのかが、今回の最大のテーマだったわけですが、まずは参考ページの設定そのままで試してみます。前回までの設定で仮想アドレスには送受信できていたわけですが、まずはその設定のままでうまく行ったらラッキーなどという甘い考えで(笑)チャレンジ!・・・大方の予想通り、玉砕です。User Unknownだそうな。うむ、実にまっとうな動作。
どうしてよいかわからずしばらく検索&悩む日々。バーチャル設定にする前はうまく行っていたわけだから、変更前後で何が違うかログを眺めていると・・・
変更前は
relay=local
変更後は
relay=virtual
になってます。なるほど、そこで試しに他の設定は変えずに
local_transport = virtual → local_transport = local
にしてみると・・・relay=localとなってスクリプトが実行されました!!
virtual設定でもlocal配送になってくれさえすれば、スクリプトは呼び出せるわけですか。あっ、でもこの状態で仮想アドレス宛のメールを試してみると・・・メールが届きません。virtualにしたらlocalが、localにしたらvirtualが届かない・・これまたまっとうな動作で・・・いや、聞けば当たり前のようですが、これは何にもわからずやっている人間にとっては実に重要な作業です。動作がまっとうに思えるというのは、少しは理解が進んでるってことですから。
いろいろ調べてみると結局のところ、virtualなメールサーバにしようと思ったら、全てvirtualな配送になるってことらしいです。それじゃぁlocal配送しなければならないスクリプト起動はvirtualでは無理なのかってことになりますが、その場合は、virtualからlocalに流すことが出来るらしい。で、そのためのファイルが/etc/transportであることを発見。これには、配送がvirtualかlocalかの指定が出来るんです。中身はこんな感じ。
test@zonch.net local
こう書いておけばtest@zonch.net宛のメールはlocalとして配送されるので、virtual設定で今まで通りスクリプト起動が可能になります。ただし、このファイル、上から順に評価してマッチしたとこでストップするようなものではないので、例えば上で指定したような「それ以外全て」という様な処理は書けないことになります。希望の条件ごとにドメインを分けて、
@test.zonch.net local
などとし、test.zonch.netドメイン宛に送られたものはlocal配送などとして動作を分けるしかないと思います。