Я написал пользовательскую консольную команду для запроса моей базы данных, создания отчета и отправки по электронной почте адреса; однако я не могу успешно отправить электронное письмо. Я могу отправлять почту по электронной почте из обычных контроллеров в другом месте моего приложения, и я также могу отправить ее из моей консольной команды, если вручную создать и настроить экземпляр 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);