Qdmailでの効率のいい大量メール送信
最近はメール送信ライブラリとして、Qdmail+Qdsmtpをよく使っている。非常によく出来たライブラリで、巷でもよく使われている。使いやすくて素晴らしいライブラリだ。
Qdmail – PHP::Mail Library , Quick and Detailed for Multibyte
Qdsmtpを使うと1度SMTPコネクションをはると、そのコネクションを使い回して複数のメールを送信することができる。またQdmailと組み合わせて使えるよう設計されているので、メールを大量に送信する際にはとても都合が良い。ここでこの両者を組み合わせて大量メール送信を実現する際に注意したことや遭遇した問題についてメモしておく。
まず、メール本文が一律の場合は、何も気にする必要がない。envelopeToの設定だけでしていればよいので、1度の送信で複数の宛先にメールを送信することが出来るからだ。
次に気にすべきパターンは、メール本文に名前などを差し込む場合だ(メールによって本文が異なる)。これについてもQdmailにはメール本文のテンプレート挿し込み機能があるので問題ないし、宛先ごとにその都度本文を生成し、ループ処理でメールを送信すればよい。「ループ処理するだけならmb_send_mailでもよいのでは」ということもあるが、mb_send_mailでは、メールを1通送信するたびにSMTPコネクションを張ることになる(細かいことはさておきだいたいそのように考えて差し支えない)ので、処理速度が違うのだ。うちで使っているサーバ(非常に遅いサーバ)の場合、メール送信処理自体は0.01秒とか0.05秒とかで完了するのだが、SMTPコネクションをはる部分に1秒程度かかる。100通のメールを送信する場合送信するためにかかる時間は以下のようになる。
- Qdmailの場合
接続時間1秒+1通あたりにかかる時間(0.01秒)×100=2秒 - mb_send_mailの場合
(接続時間1秒+1通あたりにかかる時間(0.01秒)) ×100=101秒
これだけ違うのだ。前者のほうがサーバに優しいのは言うまでもないし、プログラマにも優しい(実行時間が長くなるといろいろなことを気にしなくてはいけない)。しかし前者を採用するにあたって、ちょっと複雑なことをしようと思うと、多少工夫が必要になってくる。その工夫については別途メモすることにする。