大量のメールマガジンを配信するとき、どのように送るかを考えたことはありますか。1 万件のアドレスがあったとして、一度にまとめて送りますか、それとも時間を分けて送りますか。多くの方は一度にまとめて送ると思いますが、基本的には問題ありません。信用度が高く、日常的にこうした配信を行っている場合は、大量送信はメール事業者にとっても通常の動きなので、ほとんどの場合は受信トレイに届きます。ところが、最近特に話題になっている相手がいます。Yahoo です。理由はよくわかりませんが、短時間に送信数が多いと一時的な不達(Deferral)になってしまいます。ただ、リトライすれば何回か試すうちに届くことが多く、私が見たなかで最も多かったのは、100 回再送してようやく届いたケースです。Yahoo の場合は、信用度に関係なく、内容を問わず短時間に高頻度で送ると Deferral が起きやすいようです。ここでは、この問題を解決するためにいくつかの方法を試してみました。
こうした状況に対して、基本的には DKIM などの認証を通すこと、スパムを送らないこと、送信の信用を積み上げることなどが挙げられます。これらはすべて実施していました。Gmail や Hotmail への到達率は 98% 以上あり、基本的には問題ありません。それなのに Yahoo だけは問題が大きく、一度に 300 通送るだけで大量の Deferral が発生するのです。一方、Gmail は 1 分間に 2,000 通以上送っても何も言ってきませんでした。とにかく、組み合わせて使えるいくつかの解決策を整理しました。
- 送信頻度を抑え、メールを一定時間に分散させて送り切る。少し遅く届いても、Deferral されるよりはずっと良い(また、Deferral されたメールを自動で再送すると、雪だるま式に増えてしまう)
- メールに異なる優先度を付け、複数の独立した IP から送信する
私の場合、送信するメールは 2 種類に分けられます。1 つは必ず届けなければならないもので、登録完了メールやメールアドレス確認メールなどです。もう 1 つは少し遅れても問題ないもので、メールマガジンや広告メールなどです。(個人的には、割り込みできる最優先の第 3 の優先度を加えてもよいと考えています。)
メールは送信キューに入るときに、それぞれ送信時刻が割り当てられます。一度スケジュールされた時刻は変更できません。時刻はできるだけ早い時間に割り当て、送信できるタイミングが早ければ、そのぶん早く送ります。
2 種類のメールがあるため、スケジュールは 2 つのチャネルに分けました。テストの結果、Yahoo の上限が 1 分あたり 60 通だと仮定すると、「必ず届けるメール」は 30 通分の枠を使い、残りの枠を少し遅れても良いメールに割り当てます。この分け方にしたのは、大量のメールマガジンを送ると、一瞬で 1 時間ほどメールを送れなくなる可能性があるからです。そのときに重要なシステムメールが送れなくなるのは大きな問題です。2 つのチャネルに分けることで、ある程度これを避けられます。
時間を有効に使うため、5 分以内にチャネルの空きがあれば、2 つに分けずに混ぜて送るようにしました。こうすると、メールが非常に多い場合でも、重要な必ず届けるメールは最大 5 分以内に届くことになります。
もちろん、この方法でも時間どおりに届く保証はありません。そのため、予測機能も必要です。メールが予定の時間までに届かないと予測された場合は、1 分あたりの送信頻度やチャネルのサイズを調整するか、独立した IP を追加して対応します。
このほか、Yahoo に関連情報を送ることもできます。問い合わせフォームはこちら。
これは比較的基本的な方法で、まだ修正が必要な部分もあります。もし可能であれば、皆さんのやり方もぜひ共有していただけると、とても勉強になります!
念のための注意ですが、Mandrill や Mailgun のような ESP サービスを使っている場合、そこではメールの「到達率」が表示されます。ただ、私の推測が正しければ、迷惑メールフォルダに届いた場合も到達としてカウントされているようです。しかも、どのフォルダに届いたのかはほとんど判別できません。記録には「Spam」という項目がありますが、実際には「苦情が寄せられた」という操作を指しています。サーバーが最初から迷惑メールフォルダに入れたメールは、Spam には含まれません。このことに気づいたのは、Yahoo へ送信したとき、ダッシュボード上では Spam が 2 件しかなかったのに、知人に確認したところ、メールが迷惑メールフォルダに入っていたからです。また、同じパスワード再設定メールでも、開封率は Gmail が 95%、Yahoo が 40% だったのに、到達率はどちらも 100% でした。
