1

毎日のニュースレターを受け取ることに同意したユーザーがたくさんいます。ニュースレターの内容は自動生成されているため、電子メールを送信するcronジョブを設定するだけです。

ただし、たとえば10.000人のユーザーがいる場合、そのようなcronジョブはサーバーを強制終了します。この問題を解決するために何ができるでしょうか?

100通のメールを送信した後のsleep(1)で十分ですか?(もちろん、実行時間制限を1日に設定します)

4

2 に答える 2

4

http://php.net/manual/en/function.mail.phpをご覧ください

ノート:

mail() 関数は、ループ内の大量の電子メールには適していないことに注意してください。この関数は、電子メールごとに SMTP ソケットを開いたり閉じたりするため、あまり効率的ではありません。

大量の電子メールの送信については、 » PEAR::Mail および » PEAR::Mail_Queue パッケージを参照してください。

したがって、単純に Mail_Queue パッケージを使用してください...これはすべてのメールを受け取り、それらを処理するだけです。

于 2012-09-28T08:31:16.573 に答える
3

数か月前にプロジェクトの電子メールを送信するためのシステムを作成したので、次のことを行いました。

データベースには、3 つのテーブルがあります。

ユーザー
user_emails (一部のユーザーは複数の電子メールを持っています)
email_campaign (これは、キャンペーンの送信中にデータを一時的に保存し、終了時にすべてを切り捨てるテーブルです)

キャンペーンの送信を開始すると、メールの送信が完了したすべてのユーザーの行を email_campaign テーブルに挿入します。
このようにして、キャンペーンが終了する前にエラーが発生した場合、続行する場所がわかり、誰にメールを送信したか、誰にメールを送信する必要があるかがわかります。

実際には、2 時間で 45,000 通のメールを送信できました。サーバーの過負荷なし。
あなたがやりたかったように、100通の電子メールごとにsleep()を使用します。
また、サーバー負荷が最も低い午前 2 時にキャンペーンを送信します。

1 時間あたりの送信メール数を制限するようにメール サーバーを構成することもできます。
これにより送信が遅くなりますが、サーバーの負荷が軽減されます。

于 2012-09-28T08:41:30.120 に答える