メール配信は直接SMTPをたたく
PHPでメールを大量に配信する方法を検討している。ウェブの管理画面から送信処理をするのだが、CLI版PHPで書かれたメール配信プログラムを、DSO版(モジュール版)PHPでキックし、メール配信プログラム内では、ループして送信するような処理はずっと以前から記述していた。とりあえず、それで事は足りていた。
しかしいろいろ調べる内に、もっと真面目にメール配信する手法を検討しようと言う気になった。それはマニュアルのmail関数の注意事項を読んでから。
注意: mail() 関数は、大量のメールをループ内で送信するには 向いていないことに注意しましょう。この関数は 1 通のメールを送信するたびに SMTP ソケットをいったん閉じて開きなおします。これは非効率的です。
大量のメールを送信する場合は、 » PEAR::Mail および » PEAR::Mail_Queue パッケージを参照ください。
メールの送信はmb_send_mail関数を使っているが、おそらく基本的な動作はmail関数と同じだろうから、これでは効率が悪いと言うことになるのだろう。より効率良くするためには「直接SMTPを話す」事になるとのことだ。個人的には「PHPで直接SMPTを話すなんて遅そう」と思っているのだが、そうではないらしい。今回使ってみようと思うのは、QdSmtpとQdmailの組み合わせ。
スポックさんと言う人が書いているのだが、この方のメール配信系のプログラムにお世話になっている人も多いようだ。テクメモで以前書いたQdmailReceiverもこの方の成果物だ。
プログラムの記述方法は、実際に使用してからメモするとして、これらのプログラムを使うことで、ひとつのソケット接続で、ぽこぽことメールを送信できるようになる。PHPで大量のメールを送信する際に注意すべき事項(調べて出てきた重要そうな事項)をメモしておくことにする。
- mail関数を使用せず、PHPで直接SMTPを話す。
- 一定数送信したら、一定時間休む。
sleepするような処理を入れる方がよいらしい(迷惑メール対策等で携帯宛などの場合連続して送信された大量メールは拒否られる可能性がある)。 - BCCで、例えば10通ずつとかまとめて送る方法もあり(TOの指定が必要だけど)。
- 基本的にループで処理するのだが、全てのプロセスを一つのプロセスで実行しようとせず、プロセスを分ける方法も考える(メモリリークとか)。
さてと、どうやって書こうかな。