Postfixのaliasesでcgiやphpを起動

メールをとあるアドレスに送信するとブログの更新ができたり、メール自体をDBに収めたり、メール着信をトリガーにして様々なコマンドを実行できたります。この機能はいろいろなアイディアを生むのにかなり有益な機能です。メールを送信すると監視ログが返ってきたり、メール送信するだけでサーバーの再起動ができたりと何でもできます。 postfixとdovecotの設定が終わってメールの送受信が正しくできる状態だったら、aliasesを使ってメールの転送やメール受信時にcgiを起動させたりできます。メール受信をきかっけにaliasesは起動するので、そこにいろいろな設定をすることでいろいろできます。(しかしpostfixのことがわからないとかなりきつい作業です。) postfixので設定の今一度確認したいところは、alias_maps = hash:/etc/aliasesalias_database = hash:/etc/aliasesの2つが有効になっていることです。ここでエイリアスの設定を有効にしています。(別々の行に書かれていることがあるので要確認です。)もしこの部分が有効になっていなかったら、コメントを外して有効にしpostfixを再起動させます。この設定がないとalisesのデータベースが起動しません。# /etc/init.d/postfix restart
 

メールの転送

 aliasesの典型的な使い方は実のところメール転送です。しかし「メールが着信したらxxxxをする」というコマンド処理みたいな作業を担っているので、メール転送をする代わりにcgiの起動なんかもできるというわけです。

メール転送の設定

/etc/aliasesには、username: <転送先のusername または、転送先のメールアドレス>という書式で設定が可能です。user1: user2user2: user3@example.comとかこんな感じです。注意するところはメールがぐるぐる回らないように気をつけることです。設定が終わったら、エイリアスの設定をデータベースハッシュにするコマンドを発行します。# postalias /etc/aliasesこれでメールの転送がちゃんと行われていない場合は、# newaliasesでもいいかもです。これでも駄目だったら、postfix再起動# /etc/init.d/postfix restart私の場合は、newaliasesというコマンドが効いてないみたいでした。

メール着信のタイミングでcgiを起動する

 エイリアスを有効にするとメール着信のタイミングでcgiを起動することができます。基本的にはパイプを使って渡してやります。コンソールから実行できるコマンドだったらだいたい何でも実行できるので、実行ファイルを指定しても大丈夫です。user1: "| echo hoge >> /tmp/test.txt"みたいな感じです。ここまではうまくいくのだけど、これらのコマンドを自由自在にというとこれまた結構厄介です。実行ユーザーとパーミッションの問題があるからです。実行しているのはnobody, nogroupらしい。そんなわけでpostfixと書き込みファイルとかがあるユーザーにそれぞれグループに属させていろいろできるようにするか、またはパーミッション777とか666で開放してしまうか、になります。 また、パイプ処理でシェルスクリプトやPerlの実行ファイルなどを指定して実行する際には、そのファイルの中身のパスがフルパスになっているか、ファイル中でカレントに移動しないと正しく動かないのご注意。user@example.comにメールした時にタイムスタンプを押す簡単な仕組みの例です。/etc/aliasesuser:  "| /usr/bin/php /home/user/cgi/catchmail.php"/home/user/cgi/catchmail.php [644]<?php$epock = time();$date = date('Y.m.d A H:i.s',$epock);$output = shell_exec('echo '.$date.' >> /home/user/cgi/test.txt');print "OK!\n";?>最後に書き込み用のファイルを準備します。/home/user/cgi/test.txt [666]これでメールが来るたびにタイムスタンプを押してくれます。余談ですが、この場合メール自体が受信できなくなってしまうので、メールそのものも受信したい場合は、user:  user,"| /usr/bin/php /home/user/cgi/catchmail.php"とコンマ切りで複数のコマンドを実行できます。