メールをスプールする方法¶
SwiftmailerBundle を使用してSymfony2 のアプリケーションからメールを送信する際に、デフォルトでは、すぐにメールを送信する設定になっています。しかし、 Swfitmailer とメールトランスポートのコミュニケーションによるパフォーマンス低下は避けた方が良いときもあるでしょう。次のページをロードするのに、メール送信に時間がかかってしまえば、ユーザは待たなければならないですから。この問題を避けるために、メールを直接送信するのではなく、 “spool” を選択することができます。つまり、 Swiftmailer がメールを送信しようとするのではなく、ファイルなどにメッセージを保存します。そして、他のプロセスがスプールを読み、メールの送信の面倒をみます。現時点の Swfitmailer では、ファイルへのスプールのみを対応しています。
スプールを使用するために、コンフィギュレーションを次のようにしてください。
-
YAML
# app/config/config.yml swiftmailer: # ... spool: type: file path: /path/to/spool
-
XML
<!-- app/config/config.xml --> <!-- xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer" http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd --> <swiftmailer:config> <swiftmailer:spool type="file" path="/path/to/spool" /> </swiftmailer:config>
-
PHP
// app/config/config.php $container->loadFromExtension('swiftmailer', array( // ... 'spool' => array( 'type' => 'file', 'path' => '/path/to/spool', ) ));
Tip
スプールをあなたのプロジェクトのディレクトリ内に保存するには、プロジェクトのルートへの参照ができる %kernel.root_dir% パラメータを使用してください。 :
path: %kernel.root_dir%/spool
これで、あなたのアプリケーションがメールを「送信」すれば、実際に送信するのではなく、スプールに追加されるようになりました。スプールからのメッセージの送信を非同期にすることができるようになりました。そして、次のようにスプール内のメッセージを送信するコンソールコマンドがあります。
php app/console swiftmailer:spool:send
オプションとして送信するメッセージの数を指定することができます。
php app/console swiftmailer:spool:send --message-limit=10
また、秒ごとの送信数を指定することもできます。
php app/console swiftmailer:spool:send --time-limit=10
実際には、このコマンドを主導で実行したいとは思わないでしょう。その際には、 cron ジョブやスケジュールタスクなどを使用してコマンドをトリガーし、定期間隔による実行をしてください。