maildrop の .mailfilter でスクリプト実行の種類

maildrop の .mailfilter で スクリプト(今回は php) 実行させた時のメモ

さくらのレンタルサーバーのメールで、独自のフィルタを作成するにあたって、php の実行方法(2種類)による動作の違い

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

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

test.php
  1. <?php  
  2.  $data = file_get_contents("php://stdin");  
  3.  file_put_contents("php://stdout"$data);  
  4.  // exit(1);  
  5.  return 1;  
  6. ?>  

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

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

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

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

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



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

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

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


コメント