タイムアウトなしでプログラム的にパーソナライズされた一括メール

StackOverflow https://stackoverflow.com/questions/1239425

質問

私には、世界中の人々からの約 5,000 ~ 10,000 件の (各ユーザーが指定した) 電子メール アドレスのリストがあり、それぞれがユーザー名と言語コードに関連付けられています。また、電子メールを送信したいユーザーのさまざまな言語に翻訳された 1 つのメッセージもあります。ここで、各アドレスに 1 通のプレーンテキストメールを送信したいと思います。メールの実際のテキストはユーザーの言語に応じて異なり、メール送信者のユーザー名でパーソナライズされています。

パーソナライズされた要件と、電子メールが 1 回しか送信されないという事実 (重複するが異なるユーザー リストで 1 ~ 2 年に 1 回) であるため、正式なメーリング リストはおそらく (そしてできれば) 廃止されます。サードパーティの一括メール サービスも提供されなくなりました。

プログラミング時間を無視して、(できれば)PHP でこれを手動で行う最も時間がかからない方法は何ですか?(スクリプトを書いているのは私ですが、最終的に「ボタンを押して」送信する人であるとは限りません。) 理想的な結果は、送信者がスクリプトを実行するために 1 つのコマンドを入力するだけで済むことです (電子メールを送信する)。 list)、すべての電子メールはユーザーの介入なしで送信されます。これは、電子メール リストが使い果たされるまでスクリプトを繰り返し実行する cron ジョブを設定するなどのことを避けようとしていることを意味します。

1 年前にこれを行ったとき、私は単純にメール リストを 1 行ずつ読み取り、ユーザー名、メール アドレス、および言語コードを処理し、そこから目的のメール テキストを構築してから、それを PHPMailer に提供して送信する PHP スクリプトを作成しました。個別に。私が抱えていた問題は、スクリプトがタイムアウトし、どこまで進んでメール リストを適切な場所でトリミングして再開できるかがわからないことでした。結局、スクリプトがタイムアウトしないように、1 つの電子メール リストを十分に短い複数のサブリストに手動で分割することになりました。タイムアウトを回避するか、手動で再起動して複数回電子メールが送信されないようにするために、スクリプトが電子メール アドレスごとにどこにあるかを追跡するにはどうすればよいですか?

ブラックリストへの登録の回避など、他に考慮すべき問題は何ですか?

役に立ちましたか?

解決

set_time_limit 関数について読む必要があります。メモリについては、おそらく ini_set('memory_limit', xxMB') についても読む必要があります。

Web プロセスから php cli スクリプトを実行できます。これによりフォーク (pcntl_fork) その後、親を強制終了します (親 cli プロセスが終了します)。スクリプトを実行している Web サーバー スレッドは、他のコードを続行することも、終了することもできます。

これで、cli 子プロセス (A) がフォークして (親になり)、電子メールを送信する子 (B) を監視できるようになります。子 B が終了した場合、現在の親プロセス A は再びフォークすることができ、新しい子は前の中断したところから続行します。

ファイル/データベース/共有メモリ内、またはペアになったソケット (ソケット作成ペア) 親プロセスと。

ご理解いただけると幸いです。

他のヒント

PHPは、ここでは仕事のための適切なツールではありません - (潜在的にそれによってトリガが)あなたは、Webサーバーから独立して実行されます何かをしたいだろうか、あなたは確かにタイムアウトに実行されます。

たとえば、あなたは、PHP システム()は、別のスクリプト(Perlの?パイソンに出をしているだろうか? )、その仕事をするためにバックグラウンドに、データベースからフォークをジョブ情報を読み取るます。

あなたは何のcronスクリプトを言わなかった - あなたはあなたのサーバー上のcronへのアクセス権を持っていませんか?それとも、あなたの懸念は、手動でメールジョブが持つすべての時間が送信される?cronジョブを設定したいされていません。

あなたは http://pear.php.net/package/Mail_Queue - それは私が最近使用してきた何か。あなたは、ユーザーと呼ばれるスクリプトは、メールキューに一度にすべてのメールをダンプすることができます。これは、サーバー間の通信に対処する必要はありませんので、実際にその場でメールを送信するよりもはるかに高速ではなく、自分のデータベースです。

次に、あなたはそれをcronの呼び出しごとに送信した電子メールの数に制限付きのCron、数分ごとに、Mail_Queueを呼び出すスクリプト:: sendMailsInQueueコマンドを持っています。それはあなたの懸念だ場合は、cronスクリプトを台無しにしていません - キューが空の場合、それだけで終了しましょう。あなたのメールは、コールごとに合理的なペースでのサーバのうち、トリクルます。これはcronのコールあたりの電子メールの制限のためにタイムアウトを防ぐことができます。また、突然一度あなたからのメールをたくさんによって打たれて幸せではないかもしれない他のメールサーバ、とのトラブルを防ぐことができます。

scroll top