WebArena V3とりあえず復旧した模様
午前9時8分に復旧した模様。メンテナンスは2回にわたって行われる予定なので、当然のことながら今回のメンテナンスでは速度面は改善されないとのことだったが、やっぱり遅いままだった。しかしそれ以前に、今回のメンテナンス作業そのものは無事完了したのだろうか。それが完了出来ていなければ、次のステップへも進めないだろうに。
さらなる情報が公開されることを待つのみだ。
午前9時8分に復旧した模様。メンテナンスは2回にわたって行われる予定なので、当然のことながら今回のメンテナンスでは速度面は改善されないとのことだったが、やっぱり遅いままだった。しかしそれ以前に、今回のメンテナンス作業そのものは無事完了したのだろうか。それが完了出来ていなければ、次のステップへも進めないだろうに。
さらなる情報が公開されることを待つのみだ。
アナウンス通り深夜1時にメンテナンスは開始したっぽかった(サーバに繋がらなくなったので)。いちおうメンテナンス時間は朝5時までということだった。朝起きて、接続しようとしたけど繋がらず。現在8時44分だけど未だ繋がらず。障害情報を確認するとSLA対象になる旨記載がある。しかしどうも問題の原因がファイルシステムの不具合にあるということらしい。メンテナンスが「ディスクアクセスの処理速度向上のための工事」で、不具合内容がファイルシステムとはなんともお粗末な・・・。
SLA対象とかどうでもよくて早く動いてよ・・・。仕事にならないし。
いちおう開発中のウェブアプリのバックアップはあるけれど、サーバ設定が全部消え去るというのはかなり痛い。
どうなることやら・・・。
Qdmail+Qdsmtpで大量メール送信を実現できることはメモした。しかし送信するメールがそれぞれ「添付ファイルの有無」「CCの有無」「BCCの有無」「HTMLメールかテキストメールか」など、宛先によって使い分けないといけないことも多々ある。そんな時、Qdmailを普通に使ってしまうと上手く動作しなくなる。
などとして初期化し、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コネクションで複数メールを送信できるようになる。
工夫は必要だけれども、いいライブラリは工夫次第で、その恩恵を十二分に享受することができる(ひょっとしてこれらのことも考慮したメソッドが用意されているのかもしれないけれど・・・)。
最近はメール送信ライブラリとして、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通のメールを送信する場合送信するためにかかる時間は以下のようになる。
これだけ違うのだ。前者のほうがサーバに優しいのは言うまでもないし、プログラマにも優しい(実行時間が長くなるといろいろなことを気にしなくてはいけない)。しかし前者を採用するにあたって、ちょっと複雑なことをしようと思うと、多少工夫が必要になってくる。その工夫については別途メモすることにする。
現在、とあるメール配信システムを開発している。別にメール配信のためだけのシステムというわけではなく、CRM付随のツールのような感じ。他の機能ができつつあり、ようやくメール配信の部分にこぎつけたのだがちょっと問題が出た。テストとしてGmailに送信したら迷惑メールに判定されてしまったのだ。
で、原因を少しだけ探ってみた(本格的に探ったわけではない)。まずメール本文にはURLがあるのだが、個々の受信者を識別するための識別キーを付与してある。いかにもスパムメールでありそうなURLであり、これが主な原因になっている可能性が大きい。
そこでこのURLを外してみたところ、やっぱり受信トレイに格納された。さてさて、識別キーをつけたURLをつけないとこのメールに意味がなくなるのだがどうしたものか。ということでいろいろなパターンを試してみることにした。
ここまでで、「だめじゃん」とあきらめモードだったけど、ふと気づいたことがあって試してみた。
ん~。httpsは大丈夫そうなのかもしれない。まぁ本来httpsで運用するシステムなので、それで問題ないのであればいいのだけれど。いろいろケアしてあげないといけない部分なので他のフリーメールでも試してみることにする。