2010年4月21日

[PHP-users 35143] Re:phpのmail関数がたまにfalseを返す

ナカジマです。

以下、インラインにて。

----
On Wed, 21 Apr 2010 18:00:55 +0900
choice <info@xxxxx> wrote:

> > キャリアのスパム判定は、キャリアごとに異なりますが、
> > 大抵の場合、一定の期間内(秒分単位)に特定のIPから
> > 一定以上のメール送信が行われた時点でブロックされます。
> > 送信元のメールサーバのアドレス情報が1つでも2つでも
> > 両者から同じように一定の期間内にメールが一斉送信されていれば同じことです。
> >
>
> いえ、配信するサーバも受信するサーバも当方で
> 管理するサーバとなっています。
> で、受信するサーバのほうでは特に拒否するような
> 設定は行っておりません。
>
あ、なるほど、そういうことだったのですね。失礼しました。


> > あと、/var/spool/mailも確認されましたか?
> > まだであればそこも見てください。
> > そこに送信したはずのメール情報が出力されていなければ
> > phpからsendmailコマンドに処理自体が依頼されていない可能性が高いです。
>
> 確認しましたが、期待するメールはありませんでした。
ということは、ほぼ100%の確率でphp -> sendmail への
処理依頼は実施されていない気がします。


> > 少ない件数で問題がないのであれば、
> > ロジックの組み方に問題があるような気がします。
> >
>
> うーーん。
> そういわれるとそうかなぁとも思うのですが、
> 発生したり、しなかったりということでなんだか
> すっきりしません。
どうしても原因を知りたいのであれば、
5000件の処理を実行時に、

・sendmailプロセスのモニタリング
/var/log/mail の監視(tail -f /var/log/mail でやると便利です)
/var/spool/mailの監視(tail -f /var/spool/mail)
・socket通信の状態をモニタリング
・サーバ稼働状況のモニタリング
(topコマンドやvmstatコマンド、psコマンドなど)

を同時にチェックしてみると何かわかるかもしれませんよ。
^^^^^^^
あとは、先ほど書いたようにソースコードをほじくるのが
一番手っ取り早いと思います。

中出さんのお話とphpのmail()関数の仕様を総合して
今回の現象を整理してみると(適当に途中一部端折ります。)

(1) モジュール内でwhile開始
(2) phpのmail()関数実行
---- ここまではphpの動作 ----

---- Linux側の動作 ----
(3) socket open
(4) sendmailコマンド実行
(5) socket close
---- Linux側の動作 ----

---- ここからphpの動作 ----
(6) sendmailの実行結果を受ける
(7) mail()関数呼び出し相手にレスポンス(true or false)を返す
(8) モジュールでレスポンスをキャッチ

が大雑把ですが今回の処理の流れだと思います。
この「Linux側の動作」の部分のうち、
(4)に処理が正常に到達していれば、
送信ができてもできなくてもsendmailのログが出力されているはずです。

でも、もし(3)の部分でこけていたら、
phpのログにも、sendmailのログにも出ません。
socket通信を管理しているカーネル側で問題が発生したと
認識されているからです。
よってsocket通信の状態をモニタリングしてみるしかないと思います。

--
ナカジマ
<blueseeds@xxxxx>

_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2010年4月21日 18:22
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95242
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。