sseze's blog

インターネットとガジェットが好きな人のブログです

メール受信をトリガに複数の処理を実行する方法

/etc/aliases や、~/.forward を使うことで、メールサーバ(ここではsendmail互換のPostfixなど)がメールを受信したことをトリガにして、プログラムを実行することができる。メールの転送設定や、空メールを受信したら登録用URLを送信する場合は、よくこの方法が取られる。


メール受信をトリガにメールのヘッダ情報をDBに取り込むプログラムを書いたのだが、メールボックスにメールを取りこむ前にプログラムが実行されてしまうため、結果、DBに格納できない状態で小二時間ほど詰まってしまった。
解決策がググってもなかなか出てこないので、同じ様なことをしたい人用にメモしておく。


結論から言うと、メールを複数人に転送する場合の応用と考えれば良いらしい。
複数人にメールの転送をするためには、各ユーザ(あるいはメールアドレス)をカンマで区切って、羅列すれば良い。
/etc/aliases ならこんな感じ。

myusername : user1, user2, user3@hogefuga.com, …

メールボックスへの格納とDBへ格納するプログラムも、これと同じように考える。
つまり、メールを受信したら、再帰的に、自身のアドレスにメールを配送し、次にプログラムが事項されるようにすれば良い。

/etc/aliases なら、

myusername : myusername, "| myprogram"

~/.forward なら、

myusername, "| myprogram"

でOK。
※ /etc/aliases の場合は、newaliasesコマンドをを忘れずに。


ここで順次実行なのか、並列実行なのかについて触れてるけど、上の様な処理ができることから、多分、順次実行で処理が行われているものと思われる。


また、カンマで区切る方法以外に

半角スペースで区切る方法や、

myusername : myusername "| myprogram"

&&でもいけた。

myusername : myusername && "| myprogram"

この辺の仕様はかなりアバウトなようです。
(ウラを取ろうとしたけど仕様について詳しく書かれたソースは見つからなかった)