[PHP-users 26929] Re: mb_send_mail()の処理

荒木 満 araki @ rose.zero.ad.jp
2005年 9月 18日 (日) 20:59:21 JST


皆さん、ご指導いただきありがとうございます。
MTAによっても違ってくるのですね。

> まず、環境を書きましょう。
> PHPのバージョンとか。OSとか。CGI型なのかApacheモジュール型なのかとか。
> メールもからむのであればメールサーバの種類とか。sendmail?postfix?

すみません。忘れてました。(汗)

> Apache+mod_phpによる共用ホスティング型で、
> その5000件メール送信処理をブラウザからsubmitボタンを押すような
> 形でやっているのだとすれば、
> たぶん処理件数が多くなって処理時間がかかるにつれて
> ある時点でApacheのtimeoutに引っかかってしまって処理が止まるのでしょう。
> たいていの場合timeout値は300秒(5分)前後になっています。
> 

まさにそのとおりです。5分くらいでエラーが出ていたようです。

> 2の方法だとメールのTO:ヘッダに5000件くらいのメールアドレスが
> 羅列されることになってそのままメール送ると「情報漏えいだ!」などと
> 騒がれることになるような・・・。
> それ以前に、5000個ものメールアドレスだと
> メールサーバが「too many recipients」で受け付けてくれない
> ケースが十分ありうるでしょう。

この方法は、とtoヘッダに羅列されるのですね。使わなくて良かったです。

> ブラウザを通じた処理ではなくshell上からの手作業ないしcronなどで
> 1の方法を用いたPHPスクリプトをコマンドラインで叩くのが
> 一番確実でよく使われる方法ですが、シェルの利用やcronが許可されて無い
> レンタルサーバだと無理な相談。
> 
> そこで、500件ずつくらいで分けて送信するロジックを考えたほうがいいでしょう。
> 
> 1.最初の処理でとりあえずメールアドレス等必要情報を5000件分、
>   テンポラリファイルなりセッション情報なりに書き出す。
> 
> 2.次にそのうちの500件をループでひとつひとつmb_send_mailする。
>   500個終わったらそのぶんをテンポラリ情報から消して、ブラウザには 
>   <META HTTP-EQUIV="refresh" CONTENT="5; URL=スクリプトのURL">
>   とでも返しておく。これでブラウザが勝手にリクエストしなおしてくれる
>   のでApacheのtmeoutをくぐり抜けることができる。
> 
> 3.以降、テンポラリ情報がなくなるまで繰り返す。
> 4.テンポラリ情報が無くなったらブラウザに「<h1>おわったよ</h1>」を返す
> 
> こんな感じかなあ。
> なお、無限ループ防止や二重起動防止をよく考えたほうがいいです。
> 

この方法でトライしてみようと思います。
結果についてまたご報告させて頂きます。

みなさま、本当にありがとうございました。


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