Я недавно перенес этот веб-сайт (созданный с Symfony 2) на новый сервер, и мы решили использовать Службы Google для отправки электронных писем.
После некоторых проблем с подключением Ive удалось настроить его. Я знаю, работает, потому что я могу отправить письмо в командной строке, используя:
app/console swiftmailer:email:send --subject="Test" --body="test" --from="xxxx" --to="yyyyy"
Это работает, электронное письмо отправлено, и я получаю его немедленно.
Проблема в том, что внутри сайта не работает. Вот код:
$mailer = $this->get('mailer');
$message = $mailer->createMessage()
->setSubject('Caderno Mágico: Redefinir Senha')
->setFrom(array($this->container->getParameter('server_mail_address') => 'Caderno Mágico'))
->setTo($usuario[0]->getEmail())
->setBody($this->renderView('Emails/recuperar_conta.html.twig', array('username' => $usuario_selecionado->getUsername(), 'dados' => $hash)), 'text/html');
$mailer->send($message);
Кажется, работал раньше. Адрес электронной почты пользователя совпадает с тем, который я использовал в тесте командной строки. И используемый там конфиг должен быть таким же, какой используется при отправке через командную строку:
swiftmailer:
transport: smtp
host: smtp.gmail.com
username: yyyy
password: ******
auth_mode: login
port: 465
encryption: ssl
spool: { type: memory }
swiftmailer.plugins.loggerplugin:
class: 'Swift_Plugins_LoggerPlugin'
arguments: ['@swiftmailer.plugins.loggerplugin.logger']
tags: [{ name: 'swiftmailer.default.plugin' }]
swiftmailer.plugins.loggerplugin.logger:
class: 'Swift_Plugins_Loggers_EchoLogger'
arguments: [false]
В любом журнале ошибок нет, а метод send возвращает true. Это просто не работает. (Я пробовал с и без катушки: без разницы). Электронное письмо не отправлено.
Я установил этот плагин «EchoLogger», и он работает в командной строке. Я вижу все сообщения и ошибки на выходе, которые помогли мне настроить конфиг и устранить проблемы с подключением. Но, похоже, что это ничего не делает, когда выполняется сервером, я не вижу никаких сообщений на экране или в каких-либо журналах.
Я даже пытался записать все значения в коде точно так же, как они находятся в моем тесте командной строки, чтобы исключить возможность чего-то не так, и все же ничего:
$mailer = $this->get('mailer');
$message = $mailer->createMessage()
->setSubject('Test')
->setFrom('yyyyy')
->setTo('xxxxx')
->setBody('test');
$mailer->send($message);
Так что я могу сделать? Что может быть не так? Я даже не знаю, как отладить это. Почему он будет работать при запуске из командной строки и молча работать при запуске внутри сайта? Есть ли способ или место, где можно увидеть эти сообщения EchoLogger, когда код запускается на сервере?
Хорошо, я нашел свое собственное решение. Ну, больше похоже на обходной путь, на самом деле.
Похоже, у меня возникла проблема с катушкой: сообщения шли на катушку, а затем по какой-то причине никогда не отправлялись.
Итак, я нашел 2 способа заставить их работать:
принудительная очистка катушки сразу после отправки:
$mailer->send($message);
$spool = $mailer->getTransport()->getSpool();
$transport = $this->get('swiftmailer.transport.real');
$spool->flushQueue($transport);
явно отключить спул в конфиге:
spool:
enabled: false
В обоих случаях электронные письма отправляются нормально
Это может быть потому, что вы не сказали контролеру отправлять почту, используйте это:
$this->get('mailer')->send($message);