* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\SwiftmailerBundle\EventListener; use Psr\Log\LoggerInterface; use Symfony\Component\Console\ConsoleEvents; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\KernelEvents; /** * Sends emails for the memory spool. * * Emails are sent on the kernel.terminate event. * * @author Fabien Potencier */ class EmailSenderListener implements EventSubscriberInterface { private $container; private $logger; private $wasExceptionThrown = false; public function __construct(ContainerInterface $container, LoggerInterface $logger = null) { $this->container = $container; $this->logger = $logger; } public function onException() { $this->wasExceptionThrown = true; } public function onTerminate() { if ((!$this->container->has('mailer') && !$this->container->has('swiftmailer.mailer.default')) || $this->wasExceptionThrown) { return; } $mailers = array_keys($this->container->getParameter('swiftmailer.mailers')); foreach ($mailers as $name) { if (method_exists($this->container, 'initialized') ? $this->container->initialized(sprintf('swiftmailer.mailer.%s', $name)) : true) { if ($this->container->getParameter(sprintf('swiftmailer.mailer.%s.spool.enabled', $name))) { $mailer = $this->container->get(sprintf('swiftmailer.mailer.%s', $name)); $transport = $mailer->getTransport(); if ($transport instanceof \Swift_Transport_SpoolTransport) { $spool = $transport->getSpool(); if ($spool instanceof \Swift_MemorySpool) { try { $spool->flushQueue($this->container->get(sprintf('swiftmailer.mailer.%s.transport.real', $name))); } catch (\Swift_TransportException $exception) { if (null !== $this->logger) { $this->logger->error(sprintf('Exception occurred while flushing email queue: %s', $exception->getMessage())); } } } } } } } } public static function getSubscribedEvents() { $listeners = [ KernelEvents::EXCEPTION => 'onException', KernelEvents::TERMINATE => 'onTerminate', ]; if (class_exists('Symfony\Component\Console\ConsoleEvents')) { $listeners[class_exists('Symfony\Component\Console\Event\ConsoleErrorEvent') ? ConsoleEvents::ERROR : ConsoleEvents::EXCEPTION] = 'onException'; $listeners[ConsoleEvents::TERMINATE] = 'onTerminate'; } return $listeners; } public function reset() { $this->wasExceptionThrown = false; } }