Qdmailでの大量メール送信メモ

2010/12/13 | メール

Qdmail+Qdsmtpで大量メール送信を実現できることはメモした。しかし送信するメールがそれぞれ「添付ファイルの有無」「CCの有無」「BCCの有無」「HTMLメールかテキストメールか」など、宛先によって使い分けないといけないことも多々ある。そんな時、Qdmailを普通に使ってしまうと上手く動作しなくなる。

$qdObj=new Qdmail();
$qdObj->smtp(true);

などとして初期化し、SMTPオプション用のパラメータをセットして送信準備完了。このあとループ処理に入るわけだが、最初に添付ファイル付きメールを送信し、次に添付ファイルなしメールを送信すると仮定する(とりあえず同じ文章を送信することにする)。

$qdObj->to($to);
$qdObj->text($text);
if($attach){
$qdObj->attach($attach);
}
$qdObj->send();

「宛先と本文をセットして、添付があればそれをセットして送信」。他にもfromやらsubjectやらあるので適宜セット。これをループで回すだけなのだが、実はこれNG。最初の送信は問題ないのだが、1回目の送信で添付ファイルがセットされると、2回目の送信でも1回目と同じ添付ファイルを送信してしまう。それは同じオブジェクトを使いまわしているからだ。宛先と本文は上書きしているのだが、添付ファイルは上書きしていないことが原因だ。もちろん何がしかの上書き処理をいれればよいのだが、いろいろな項目で(CCやらBCCやら)上書き処理するのはちょっと面倒ではないだろうか。

Qdsmtpには便利なメソッドが用意されている。reset()だ。このメソッドを呼び出すと格納した内容がクリアされるのだが、このメソッド、全部クリアしてしまうのだ(そのように動作しているように見えるのだが、プログラムの中を読んでいないので定かではない)。つまりSMTP送信もコネクションも一切合切クリア。2通目を送信する際にはSMTPオプションのセットから何からやり直し。当然コネクションも貼り直し・・・。これではmb_send_mailでループ処理するのと同じことになってしまう。

でも実は大丈夫。別の方法で乗り切ることができる。

ループ処理の際、生成したインスタンス$qdObjに対して直接本文等を代入するのではなく、いったんcloneしてから処理すれば良い(ループ中の最後の処理でコピーした変数をunset()する)。これを使えば、メールの内容は毎回リセットされているし、かつ一つのSMTPコネクションで複数メールを送信できるようになる。

工夫は必要だけれども、いいライブラリは工夫次第で、その恩恵を十二分に享受することができる(ひょっとしてこれらのことも考慮したメソッドが用意されているのかもしれないけれど・・・)。

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net