Не удалось отправить электронную почту из пользовательской команды Symfony2, но может из другого места в приложении

Я написал пользовательскую консольную команду для запроса моей базы данных, создания отчета и отправки по электронной почте адреса; однако я не могу успешно отправить электронное письмо. Я могу отправлять почту по электронной почте из обычных контроллеров в другом месте моего приложения, и я также могу отправить ее из моей консольной команды, если вручную создать и настроить экземпляр Swift_Mailer и не получить его через контейнер.

Вот урезанная версия моей консольной команды:

<?php namespace Foo\ReportBundle\Command; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ExpiryCommand extends ContainerAwareCommand { protected function configure() { $this->setName('report:expiry') ->setDescription('Compile and send e-mail listing imminent expiries'); } protected function execute(InputInterface $input, OutputInterface $output) { /* ... */ $message = \Swift_Message::newInstance() ->setSubject('Expiry report') ->setFrom('DoNotReply@domain.com') ->setTo('recipient@domain.com') ->setBody($body); $mailer = $this->getContainer()->get('mailer'); /* This works... $transport = \Swift_SmtpTransport::newInstance('smtp.domain.com', 25) ->setUsername('username') ->setPassword('password'); $mailer = \Swift_Mailer::newInstance($transport); */ $result = $mailer->send($message); $output->writeln($result); } } 

Swiftmailer настроен для отправки через SMTP в моем файле app/config/config.yml ( delivery_address: dev@domain.com также устанавливается в app/config/config_dev.yml ):

 swiftmailer: transport: smtp host: smtp.domain.com username: username password: password spool: type: memory 

При запуске команды он печатает 1 в командной строке, что, я полагаю, означает, что она была успешной. Тем не менее, я одновременно отслеживаю журналы почтового сервера, и это даже не соединение.

Чтобы подтвердить, что моя конфигурация загружается в почтовую программу, я сменил катушку из memory в file и при запуске команды php app/console swiftmailer:spool:send в файловую систему была запущена, и я могу успешно очистить катушку в командной строке с помощью php app/console swiftmailer:spool:send .

Кто-нибудь есть идеи относительно того, что здесь происходит, или какие-либо предложения относительно того, как я могу отлаживать его дальше? Ничего не появляется в моем файле app/logs/dev.log . Я использую Symfony 2.1.3-DEV.

От копания некоторых кодов Symfony и SwiftMailer я вижу, что катушка памяти сбрасывается на событие kernel.terminate которое возникает после отправки ответа. Я не уверен, что это работает для команд, но я могу ошибаться.

Попробуйте добавить этот код в конце своей команды и посмотрите, помогает ли он:

 $transport = $this->container->get('mailer')->getTransport(); if (!$transport instanceof \Swift_Transport_SpoolTransport) { return; } $spool = $transport->getSpool(); if (!$spool instanceof \Swift_MemorySpool) { return; } $spool->flushQueue($this->container->get('swiftmailer.transport.real')); 

Вместо катушки памяти используйте файловую катушку. Измените app/config/config.yml :

 swiftmailer: transport: "%mailer_transport%" host: "%mailer_host%" username: "%mailer_user%" password: "%mailer_password%" spool: { type: file, path: %kernel.root_dir%/spool } 

Просто добавьте это в конец действия выполнения:

 $container = $this->getContainer(); $mailer = $container->get('mailer'); $spool = $mailer->getTransport()->getSpool(); $transport = $container->get('swiftmailer.transport.real'); $spool->flushQueue($transport);