2015-12-29 2 views
2

Я пытаюсь отправить электронные письма в пользовательскую команду с буферизацией памяти. Согласно сдаточной документации здесь:Symfony 2.7.3 и Swiftmailer 5.4.1 не работают в командах: почему они используют NullTransport

http://symfony.com/doc/2.7/cookbook/console/sending_emails.html

Это происходит автоматически, так как Symfony 2.3/Swiftmailer 2.3.5, но он не работает.

Я попробовал стандартный способ

$email = \Swift_Message::newInstance() 
    ->setSubject('New Email') 
    ->setFrom('[email protected]') 
    ->setTo($recipients) 
    ->setBody($message); 
$container = $this->getContainer(); 
$container->get('mailer')->send($email); 

Ничто не отправлено.

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

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

Это тоже не сделал ничего.

Письма отправляются с моих контроллеров, поэтому я знаю, что swiftmailer настроен правильно.

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

редактировать: При использовании подкачки памяти, flushQueue вызывается из поставщика/SwiftMailer/SwiftMailer/Библиотека/классы/Swift/MemorySpool.php

Я редактировал эту функцию var_dump переменного $ транспорта, который он использует, и он решил использовать нулевой транспортные Swift_Transport_NullTransport, который следует использовать только тогда, когда disable_delivery установлен на конфигурации (или если транспорт установлен в нуль в конфигурации)

Я думаю, что это является причиной неудавшегося сообщения электронной почты, так мой новый вопрос: зачем нужны команды с помощью NullTransport?

редактировать 2: Проблема, как представляется, исходя из этой линии

$spool->flushQueue($this->container->get(sprintf('swiftmailer.mailer.%s.transport.real', $name))); 

в SwiftMailer-расслоением/EventListener/EmailSenderListener.php

У меня есть только одна настройка почтовой программы в моей конфигурации

swiftmailer: 
    transport:  %mailer_transport% 
    host:   %mailer_host% 
    username:  %mailer_user% 
    password:  %mailer_password% 
    spool:   { type: memory } 
    port:   %mailer_port% 
    encryption:  %mailer_encryption% 
    sender_address: %mailer_sender_address% 

, который вытягивает значения из paramters.yml

mailer_transport: sendmail 
mailer_host: smtp.sendgrid.net 
mailer_user: [USERNAME] 
mailer_password: [PASSWORD] 
mailer_port: 465 
mailer_encryption: ssl 
mailer_sender_address: [email protected] 

но по какой-либо причине транспорт, который возвращается для «swiftmailer.mailer.default.transport.real», является нулевым транспортом.

ответ

0

Я не мог заставить это работать вообще. Symfony/Swift будет использовать только NullTransport в командах, консоль дает мне это для транспортировки по умолчанию

$ php app/console debug:container 
... 
swiftmailer.mailer.default.transport.real  Swift_Transport_NullTransport 
... 

так что я сдался и перешел на другой подход.

Я использую FOS restbundle, поэтому я переместил команды электронной почты, которые я пытался создать для контроллера останова.Тогда я называю их с завитком из командной строки

$ curl --request POST http://api.mydomain.com/api/emails/foo/bar.json 

Это позволяет мне автоматизировать вызов, чтобы отправить электронную почту с помощью кронтаб.

мне пришлось изменить код немного, основные изменения как этот

// Command 
$container = $this->getContainer(); 
$entityManager = $container->get('doctrine')->getManager(); 
// Controller 
$entityManager = $this->getDoctrine()->getManager(); 

Использование отдыха и скручивание не так, как это должно быть сделано, но, по крайней мере, это работает.

 Смежные вопросы

  • Нет связанных вопросов^_^