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

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


ナカジマです。

以下インラインにて。
----
On Wed, 21 Apr 2010 17:02:37 +0900
choice <info @ choice-site.com> wrote:

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


> あと、sendmailのログ(/var/log/maillog)に
> 該当するメルアドの記載がないのが不明です。
> 
> sendmailに渡せなかったから、ログに記載がない
> ということなのかなぁとおもっています。
当然、mail()関数は、内部的にsendmailコマンドをたたいているわけですから
sendmailコマンドに処理が渡らなければログは出ません。

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

sendmailコマンドに処理が依頼されていれば
少なくともそこに送信しようとしたメールの内容が出力されているはずです。
メールのスプールについては以下のサイトが参考になるかと思います。
http://www.fmmc.or.jp/fm/nwts/rh_linux/ch5/5_4.html

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


----
On Wed, 21 Apr 2010 17:10:41 +0900
choice <info @ choice-site.com> wrote:
> 
> 件数が少ない場合は、この現象は発生しません。
> 5000件程度の配信をすると5000件のうち、数件で
> mail関数がfalseを返します。(処理は止まりません)
> なお、必ず「最初の数回」とか「3件目と4件目」ということでなく、
> ランダムに数回発生します。
ちなみに少ない件数は、何件ぐらいで試されたのでしょうか?
少ない件数で問題がないのであれば、
ロジックの組み方に問題があるような気がします。

どうしてもmail()関数でやりたいのであれば、
全てのアドレスを30件とか10件に分割してBCCにセットし
それをsleep(30)ぐらいの間隔で送信するとかはだめなのでしょうか?
(たぶん30秒もあれば大丈夫だとは思いますがサーバのスペックにもよるかも)
メールを受け取る側的には、Toで送信されたように見えるので問題ないかと。

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


-- 
ナカジマ
 <blueseeds @ skysnow.jp>



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