Symfony2でCommandからメール送信する時のちょっとした設定
久しぶりにSymfony2の事を書きますよノシ
過去に書いていた説明をすっ飛ばして、
コンソールコマンド(Commandの事ね)からメールを送信する時にメチャクチャ困ったから書いておく。
今回はメール送信に標準のswiftmailerを使ってます。
Symfon2を使う方は必ずお世話になりますね。
で、メール送信時はfileにspoolするんじゃなくてmemoryで設定してます。
話はここからで下記の例ではControllerにメール送信用のコードを書いた場合だけど、
特に意識する必要も無く、
$message = \Swift_Message::newInstance() ->setSubject('メール送信しますたノシ') ->setFrom(array('from@examples.com')) ->setTo('to@examples.com') ->setBody('メール送信だよ〜ん') ; $this->get('mailer')->send($message);
とこんな風に書けばメールは送信されますですはい。
じゃあ今度は同じようにCommandに
$message = \Swift_Message::newInstance() ->setSubject('メール送信しますたノシ') ->setFrom(array('from@examples.com')) ->setTo('to@examples.com') ->setBody('メール送信だよ〜ん') ; $mailer = $this->getContainer()->get('mailer'); $mailer->send($message);
と書いてコマンドを実行するとなぜかメールが送信されません。
何でかな〜どうしてかな〜寒いな〜寒いな〜怖いな〜
と思って悩んでSwiftmailerBundleのソースを眺めていると一筋の光明が。
上記だけではダメらしくて以下のコードもCommandへ記述する必要がありますた。
$transport = $mailer->getTransport(); if (!$transport instanceof \Swift_Transport_SpoolTransport) { return; } $spool = $transport->getSpool(); if (!$spool instanceof \Swift_MemorySpool) { return; } $spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));
transportとspoolを宣言した後のif文は念のためにチェックしているだけで、
memory以外を設定している人はどうなるか知りません。
で、肝心の
$spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));
が必要でした。
これを記入後、コマンドを実行すると無事にメールが送信されるようになりますたノシ
Commandの全文は端折ってメール送信部分だけを書いておくとこんな感じ。
$message = \Swift_Message::newInstance() ->setSubject('メール送信しますたノシ') ->setFrom(array('from@examples.com')) ->setTo('to@examples.com') ->setBody('メール送信だよ〜ん') ; $mailer = $this->getContainer()->get('mailer'); $mailer->send($message); $transport = $mailer->getTransport(); if (!$transport instanceof \Swift_Transport_SpoolTransport) { return; } $spool = $transport->getSpool(); if (!$spool instanceof \Swift_MemorySpool) { return; } $spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));
いやぁはまったはまった。凄くはまった。
これは公式サイトにも書いておいてほしいものですね。