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

blueseeds @ skysnow.jp blueseeds @ skysnow.jp
2010年 4月 21日 (水) 18:22:17 JST


ナカジマです。

以下、インラインにて。

----
On Wed, 21 Apr 2010 18:00:55 +0900
choice <info @ choice-site.com> 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 @ skysnow.jp>



PHP-users メーリングリストの案内