モブログするためのalias

メールを受信したらPHPスクリプトに標準入力しよう、というありがちなお話。qmailのaliasはやったことがあったのだけど、今回はMTAがpostfixだった。いろいろなサイトを参考に、当初、以下のように設定してみたけど、これだとうまく動かなかった。

/etc/aliases 動かなかった例

blog_example: "|/home/example/public_html/mt/p.php blog"

/var/log/maillog エラー文面(抜粋)

execvp /home/example/public_html/mt/p.php : No such file or directory.

No such fileとか言われても、ファイルはちゃんと存在しているのだが…。postfixの仕様書とかほとんど読んでないから、原因不明。とりあえず以下のように書くと動いた。

/etc/aliases 意図した通りに動いた例

blog_example: "|php -q /home/example/public_html/mt/p.php blog"

「-q」オプションを使用したのは、phpCLI版じゃなくてCGI版だったから、HTTPヘッダ等が吐き出されてしまったので、それを抑えるため。

p.phpの中で、コマンドラインで指定した値(この例では「blog」)が入るのは、$_SERVER['argv'][1]。これを使えば、複数のメールアカウントでp.phpを使うときに、メールをパースする前にアカウント名を渡せたりして便利。複数指定するときは$_SERVER['argv'][2],$_SERVER['argv'][3],,,となる。$_SERVER['argv'][0]には、実行しているスクリプト名が入る。

p.phpデバッグには、

tail -f /var/log/maillog

で監視するのと、

<?php
$text="エラーの内容";
error_log(date("Y.m.d H:i")." ".$text."\n",3,dirname($_SERVER['argv'][0])."/error.txt");
?>

って感じでerror.txtに自前のエラーを吐くのとで、両方使ったり片方にしたり。

qmailではp.phpの最後にexit(1);とすると「無事に受け取ったよ&その後の処理はしないでね」って意味のことをqmailに伝えられる感じだけど、postfixだとそういうのはないみたい?