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'));


いやぁはまったはまった。凄くはまった。
これは公式サイトにも書いておいてほしいものですね。