2016/07/06

maildrop の .mailfilter で php 実行の種類

maildrop の .mailfilter で php 実行させた時のあれこれメモ
さくらのレンタルサーバーのメールで、独自のフィルタを作成するにあたって、php の実行方法による動作の違い

xfilter で php スクリプトを呼び出した場合

.mailfilter
xfilter "/usr/local/bin/php /home/HOHOHO/www/FUFUFU/test.php"
if ($RETURNCODE == 1)
{
 to "maildir/.Trash/"
}

test.php
<?php
 $data = file_get_contents("php://stdin");
 file_put_contents("php://stdout", $data);
 // exit(1);
 return 1;
?>

結果
  • php で return 1; も exit(1); も $RETURNCODE へ値が反映されない(常に0)
  • stdout を行わないとメールが消失する(stdin → stdout をセットで利用)
    echoで出力してもok
  • stdout で出力した結果(メールソース)がその後利用される → ヘッダに結果を残すなど
  • exit(1); を使うと stdout が動作していない様子 → メールが消失する

シングルクォーテーション(&H60) で php スクリプトを呼び出した場合

.mailfilter
`/usr/local/bin/php /home/HOHOHO/www/FUFUFU/test.php`
if ($RETURNCODE == 1)
{
 to "maildir/.Trash/"
}

test.php
<?php
 $data = file_get_contents("php://stdin");
 // file_put_contents("php://stdout", $data);
 exit(1);
?>

結果
  • php で return 1; は $RETURNCODE へ値が反映されない
  • php で exit(1); は $RETURNCODE へ値が反映される
  • stdout を行う必要はない(出力しても無視される)



呼び出し方法による、用途の違い

xfilter
メールソース(ヘッダ追記など)を書き換えて、ヘッダになにか残したりする場合は xfilter を利用
その名の通り、フィルターなので stdout や echo でメール内容を出力しなければ、データが消失します
プログラムが異常終了した場合、メールが到着しない可能性がある

シングルクォーテーション
メールソースを変更する必要がなく、メール内容や着信イベントでプログラムを動作させ、結果の終了コードで分岐を行ったり、プログラムから別のメールを送信するなどの用途
stdin でメールソースを受け取るが、stdout は不要(出力しても無視される)
プログラムが異常終了しても、メールが到着するため比較的安全


0 件のコメント: