Как отправить SMTP письмо из Command с помощью Swiftmailer с Symfony - PullRequest
1 голос
/ 27 февраля 2020

У меня проблема с отправкой писем с Symfony.

swiftmailer.yaml

swiftmailer: 
  default_mailer: gmail_api 
  mailers: 
   gmail_api: 
     transport: gmail_api

Как видите, я не использую спулинг.

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

Из контроллера send () возвращает 1, и я получаю электронное письмо.

namespace App\Controller;

use Sonata\AdminBundle\Controller\CRUDController as Controller;

class CRUDController extends Controller
{

private $mailer;
...

public function __construct(\Swift_Mailer $mailer)
{
    $this->mailer = $mailer;
    ...
}

private function sendEmail($object, $identifiant, $type)
{
    $message = (new \Swift_Message('xxx ' . $identifiant))
                ->setFrom('xxx@xxx.xx')
                ->setTo('xxx@xxx.xx')
                ->setBody(
                    $this->renderView(
                        ...
                    ),
                    'text/html'
                )
                ->attach(\Swift_Attachment::fromPath('xxx');
    try {
        $logger = new \Swift_Plugins_Loggers_ArrayLogger();
        $this->mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));

        $numSent = $this->mailer->send($message);

        if ($numSent < 1) {
            $this->addFlash('sonata_flash_error', 'Fail to send e-mail');
        } else {
            if (method_exists($object, 'getMailing')
                && method_exists($object, 'setMailing')) {
                $object->setMailing($object->getMailing() + 1);
                $this->em->persist($object);
                $this->em->flush();
            }
        }
    } catch (\Swift_TransportException $e) {
        $this->addFlash('sonata_flash_error', $e->getMessage());
    }
    dump($logger->dump());
    exit();
}

\ Swift_Plugins_Loggers_ArrayLogger дайте мне:

++ Запуск Swift_Transport_EsmtpTransport ... << 250 OK </p>

Из команды send () возвращает 0, и я не получаю письмо.

class ExempleCommand extends Command
{
    private $mailer;
    ...   

    public function __construct(\Swift_Mailer $mailer)
    {
        parent::__construct();
        $this->mailer = $mailer;
        ...
    }



    protected function sendNotificationMail(OutputInterface $output, $subject, $body)
    {
        $logger = new \Swift_Plugins_Loggers_ArrayLogger();
        $this->mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));

        $message = (new \Swift_Message($subject))
            ->setFrom('xxx@xxx.xx')
            ->setTo('xxx@xxx.xx')
            ->setBody(
                $this->twig->render(
                ...
                ),
                'text/html'
            );
        try {
            $output->write("\n" . $this->mailer->send($message));
        } catch (\Swift_TransportException $e) {
            echo $e->getMessage();
        }
        $output->write($logger->dump());
    }

\ Swift_Plugins_Loggers_ArrayLogger дайте мне:

++ Запуск приложения \ Сервис \ Электронная почта \ GmailApiTransport ++ Приложение \ Сервис \ Электронная почта \ GmailApiTransport запущен

Почему он не начинается с Swift_Transport_EsmtpTransport в Command?

1 Ответ

1 голос
/ 27 февраля 2020

Я не уверен, как это работает с Symfony 4, с тех пор никогда не приходилось отправлять почту с помощью команды, но на Symfony 2, при использовании команды вам приходилось запускать новый экземпляр почтовой программы. Поэтому, возможно, вы можете попытаться изменить свой конструктор на

public function __construct(\Swift_SmtpTransport $transport)
{
    parent::__construct();
    $this->mailer = new \Swift_Mailer($transport);
}

(извините, у меня пока нет привилегии просто оставлять комментарии)

...