2

Symfony 2.1 フレームワークと SwiftMailer を使用したメーリング ツールに取り組んでいます。

このツールは数千の電子メールを処理する必要がありますが、smtp サーバーの制約 (変更できません) のため、500 のグループごとに処理する必要があります。各波の間に数分待つ必要があります。

これを行う方法がまったくわかりません。

アプリを実行するサーバーは、Apache と PHP 5.4 を搭載した Windows マシン上にあります。CRON タスクを使用できましたが、CRON と Symfony については何も見つかりませんでした (Symfony 1.1 では最新ではありませんでした)。

4

2 に答える 2

1

この問題の解決策は、Symfony CookbookのHow to Spool Emailの部分にあります。

于 2012-10-29T17:33:12.030 に答える
1

ここでは、Symfony の組み込み Command コンポーネントを使用します。おそらく、Symfony に同梱されている通常のコマンドに慣れているでしょう...app/console generate:bundleなどのようなものです。

ContainerAwareCommand クラスを使用して独自のものを作成できます。

必要な手順は次のとおりです。

  • 送信する必要がある電子メールのキューを保持します (おそらくデータベース テーブルに)
  • ContainerAwareCommand を拡張したクラスを作成し、コマンド名を「email:send:partial」のようにします。
    • このクラスは、データベースからの未送信の電子メールの存在をチェックする必要があります。存在する場合は、最大 500 件を送信し、データベース内のレコードを削除または更新して、送信されたという事実を反映する必要があります。
    • ちなみに、ContainerAwareCommand はもちろんコンテナ対応です... つまり、Monolog、Twig、そしてここで最も重要な Doctrine などのサービスにアクセスできます。したがって、 を使用して、データベース テーブルから未送信の電子メールを取得できます$this->getContainer()->get("doctrine")
  • cron で、メール サーバーによって提供される間隔を使用して通常のジョブを設定します (実行の遅延を考慮して 1 ~ 2 分を加えます)。このためのコマンドは次のようになります/path/to/symfony/app/console email:send:partial

それはあなたをそこに連れて行くはずです。以下に、ContainerAwareCommand クラスのリファレンスをいくつか示します。

http://symfony.com/doc/2.0/cookbook/console/console_command.html

http://api.symfony.com/2.1/Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand.html

于 2012-10-29T15:54:27.573 に答える