バーチャールドメインでメール受信からスクリプトを実行
サーバがメールを受け取ったら、スクリプトを実行する処理を作成していたときのメモです。なんかいつもここはまるので。。。
はまるのは、バーチャルドメインを使用しているからで、使用していなければ、素直な設定でうまくいきます。と言いつつも、1つのサービス、1つのサーバで賄えるほど経済的な余裕はありませんので、複数のサービスを1つのサーバで動かします。となると、必要になるのがバーチャルドメインですね。ウェブでは、Apache などの設定が簡単でいいのですが、Postfixだと少々はまります。しかも、メール受信のタイミングでスクリプトを起動させる際には、特に注意が必要です。
なぜかと言うと、バーチャルドメインを使用していると、そのまま受け取ったメールをスクリプトに流しこむことができないからです。なので、ワンクッション置いてあげる必要があります。このワンクッションの方法は2つあって、1つは、.forwardを使う方法。もう1つは、aliasesを使う方法です。
私自身は、昔は.forwardを使う方法でやっていたのですが、最近はaliasesを使うようにしています。よく.forwardを書くのを忘れてしまうので。
まず、/etc/postfix/main.cf
一番最後にvirtual_alias_domains と virtual_alias_map を追加してあげます。
virtual_alias_domains = example.com, example.net, example.org, ganchiku.com, scubaeye.com, 5kinjo3.com virtual_alias_maps = regexp:/etc/postfix/virtual
のような感じです。virtual_alias_mapsでvirtual の転送先でも指定してみましょう。/etc/postfix/vitual
/^info@example.com$/ example@gmail.com
/^info@example.net$/ example@gmail.com
/^info@example.org$/ example@gmail.com
/^aaa-[0-9]{9}(@.*)example.com$/ example, example@gmail.com
ここでは、info@example.(com|net|org)に来たメールは、全部example@gmail.com に転送しています。また、aaa-030494944@example.com 等aaa-以降のランダムに来た数字9つに届くメールは全部 example ユーザと example@gmail.com に転送します。ところで、exampleユーザっていましたか?そんなユーザはいないですよね。
ここで、example ユーザへの転送ではなく、スクリプトを直接指定できたらいいのですが、これができないんですね。なので、上に書いたようにワンクッション置いてげて、aliases でスクリプトを指定してあげる必要があるんですね。というわけで、/etc/aliases を修正してあげます。
postmaster root example |"/home/shin/prod/example/symfony mail:receive-mail"
なんかコロンがあるとフォーマットが違う!と怒られることがあるので、怒られたら取っておきます。見ればわかりますが、example がメールを受信すると symfony コマンドが実行されます。また、標準入力としてメールを受け取っています。あとは、このタスクの中でゴニョゴニョすればいいんですね。
なお、/etc/postfix/virtual, /etc/aliases は両方ともpostmap してvirtual.db, aliases.db を作成しておきましょう。なお、 /etc/aliaes を postmap して aliases.db を作成しておきましょう。virtual に関しては、postmap はいらないという指摘をいただきました。あと、postfixの再起動も。
整理すると、次のような感じです。
1./etc/postfix/main.cf でバーチャルホストを使うように指定してあげる。
2./etc/postfix/virtual で受け取ったメールを調べて、スクリプトに渡すものがあれば、ユーザ(エイリアス)にそのまま渡してあげる。postmap を忘れずに。 /etc/aliases に postmap をするのを忘れずに
3./etc/aliases で2で指定したユーザ(エイリアス)で受け取り、スクリプトに渡す。
以上です。整理して考えるとわかるんだけど、virualからaliasesに渡すのって、最初はなんで?って思うんだよなー。



Shin Ohno 2003-2012