php

メール配信関係のシステム設計

このところホームページやサービス登録ユーザー宛にメールを送信したいという案件が立て続けに来ています。

メール配信はWebプログラムを始めたばかりの人でも簡単に書ける単純な物なんですが、それを複数の人に一度に送るとなると少し頭を抱えてしまいます。
当然ですが配信自体は難しい物ではありません。

たとえば予め配列に入れた10人に送る場合は

<?php
$i = 0;
while($i < 10){ // Mail送信部分(省略) mb_send_mail($MAIL_LIST_ARRAY[$i],,,); $i++; } ?>

タイトルや本文やいろいろと省略はしてますが、このようなスタイルで配信することになります。

ただし配信する人数が10000件、20000件と多くなった場合はどうなるでしょう。。。

ほとんどの一般的なレンタルサーバーはphpの動く時間が短く設定してあります。
30秒とか1分とかです。。。

このような短い時間では、数万件のメールを配信するにはタイムアウトの壁にぶつかり、何人送れたのかすら分からないままにフリーズするでしょう。
フリーズするならまだマシなのですが、仮に数万件のメールを同じプロバイダのメールサーバーへ送るとどうなるでしょう。

受け取る側はたまったもんじゃありませんね。

自社サーバーであっても、すぐに送信元の接続するプロバイダへ連絡が入り回線をストップされます。

その後、プロバイダからお電話があります。。。(笑
「たくさんのメールを送信されましたか?」
です。。。。いや、でした。。。(笑

では、どうやれば問題なく配信できるか。。。になってくるわけです。

皆さんなんらどうします?

私ならまず送信する時間を計ってみます。
そうですね、たとえば50件づつくらいに分けて数時間送ってみます(自分宛に)

そこで全て受信でるかを確認します。
仮に最終送信されたメール受信に問題がなければ、配信前に送信リストをシートに分割して、そのシートを順に送信していきます。
送信するサーバーによって一定時間内のメール送信数に制限があるため、方法としては1つのシート内のメールアドレスリストを送信し次のシート用のパラメータへリダイレクトします。(送信サーバーを変更して送信)
ここで注意が必要なのは、実際の送信時間より先にプログラムが終わっていると思ってください。
リダイレクトへの時間も数秒間後がいいですね。

このような方法は、
悪意のあるメール配信には利用しないようにしてください。