モブログするための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」オプションを使用したのは、phpがCLI版じゃなくてCGI版だったから、HTTPヘッダ等が吐き出されてしまったので、それを抑えるため。
p.phpの中で、コマンドラインで指定した値(この例では「blog」)が入るのは、$_SERVER['argv'][1]。これを使えば、複数のメールアカウントでp.phpを使うときに、メールをパースする前にアカウント名を渡せたりして便利。複数指定するときは$_SERVER['argv'][2],$_SERVER['argv'][3],,,となる。$_SERVER['argv'][0]には、実行しているスクリプト名が入る。
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だとそういうのはないみたい?