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

choice info @ choice-site.com
2010年 4月 21日 (水) 18:00:55 JST


中出です。

レス、ありがとうございます。

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

いえ、配信するサーバも受信するサーバも当方で
管理するサーバとなっています。
で、受信するサーバのほうでは特に拒否するような
設定は行っておりません。

ですので、配信サーバのほうで、5000件配信したら
受信サーバのほうに5000件届いて欲しいのですが、
なぜか、うち数件がmail関数のエラーにより配信され
ない(sendmailのログにも載らない)という状況です。
また、エラーになるアドレスはいつも決まっている
わけではありません。


> あと、/var/spool/mailも確認されましたか?
> まだであればそこも見てください。
> そこに送信したはずのメール情報が出力されていなければ
> phpからsendmailコマンドに処理自体が依頼されていない可能性が高いです。

確認しましたが、期待するメールはありませんでした。



> あとはsocket通信の状態をモニタリングしてみるのも手だと思います。
> メール1通あたりのデータ量が多すぎるのか、
> 短い間隔で頻繁にsocketのopen/closeを繰り返すため通信がダウンしたのか
> 原因がわかるかもしれません。
> Google先生に「CentOS socket」といれれば
> たぶん説明してくれるサイトが見つかります。
> 

ありがとうございます。
調べてみます。


> > 件数が少ない場合は、この現象は発生しません。
> > 5000件程度の配信をすると5000件のうち、数件で
> > mail関数がfalseを返します。(処理は止まりません)
> > なお、必ず「最初の数回」とか「3件目と4件目」ということでなく、
> > ランダムに数回発生します。
> ちなみに少ない件数は、何件ぐらいで試されたのでしょうか?

1000件程度です。

> 少ない件数で問題がないのであれば、
> ロジックの組み方に問題があるような気がします。
> 

うーーん。
そういわれるとそうかなぁとも思うのですが、
発生したり、しなかったりということでなんだか
すっきりしません。

> あとは他の方がレスをされていますが、
> mail()関数にこだわる理由がないのであれば
> PEARやPECL、Zend Framework APIなどを利用してみるのもありだと思います。

mail関数にこだわるわけではないのですが、
なぜ、できないのかが気になりますので、他を
探すよりもまずは原因を追究したいです。

> > はい、知っています。
> > ただ、非効率ということであって、不可能ということで
> > はないと理解してます。
> > 
> > もしかして、mail関数がエラーを返したのは、
> > 「SMTPソケットを開けなかった」ということなんでしょうか?
> > そうれであれば、sendmailにわたらなかったので
> > sendmailのログにも記載されなかったという理由が
> > 納得できます。
> マニュアルで「非効率」とか「推奨されない」と書いてある場合、
> 十中八九、その方法は使用しないほうが賢明です。
> 言語として理論上は動作するが、確実な動作保証がないということです。
> mail()関数がfalseを返すケースについては、
> phpのソースを落としてきてmail関数を定義しているソースを
> ほじくってみればわかると思います。
> ※すみません、私はまだほじってないので^^;
> 

すみません。
やってませんでした。
見てみますが、わかるかどうか…。(^^;)

> 
> > ただ、phpのエラーログに記録されなかったのは
> > 不明ですが。
> 前のメールにも書きましたが、
> errorやwarningなどではなく
> boolean型の「false」が帰ってきているわけですよね?
> つまり、それはマニュアルにも書いてあるとおり、
> php自身はmail()関数内において正常処理、
> (判定による意図的なエラー処理も含む)
> つまり、想定の範囲内の動きをしたわけです。
> phpにとってそれはエラーではありません。
> 
> エラーログにでるということは、
> phpとして想定外の動きをされたので例外処理をしたということです。

たびたび説明していただき、ありがとうございます。
理解しました。

以上、よろしくお願いします。

----



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