PHP*1のmail()は内部で sendmailコマンドを呼び出している。
sendmailコマンドが標準出力や標準エラー出力になにかゴミを出力すると、そのまま出てきてしまう。
mail()の前に ob_start() を入れ 終わったら ob_end_clean() を呼ぶようにしても、出力を抑止することができない。
<? ob_start(); mail($to, $subject, $body, $header, $parameter); // sendmailコマンドの標準出力、標準エラー出力ともに ダダ漏れする ob_end_clean();
つまり、PHP側でなんとかすることはできない。
CGIとして使っていれば画面に不用意なテキストが出力されることになるし、xinetdなどで通信させていれば相手に変な応答を返すことになる。
(深刻な問題)
ob_start()が効くのはPHP標準のprint/echoなど一部の出力に限られ、それ以外の手段で出力している分についてはバッファリングは効かないらしい。 mail()は代表例とのこと
<? fclose(STDOUT); fclose(STDERR); // ★xinetd経由ならここでセッションが切断する mail($to, $subject, $body, $header, $parameter); // sendmailコマンドの標準出力、標準エラー出力ともに停止する echo "hoge"; // 当然 出力されない $fp = fopen('php://stdout', 'w'); fwrite($fp,"piyo\n"); // 一応出る
標準出力、標準エラー出力を閉じてしまえばいけるが、再び出力したくなっても再オープンしなければ出力できない
また、xinetd経由の場合出力を両方閉じてしまうとセッションが切断されるので、この方法は一時的な抑止として使えない
*1:PHP5.3.3