* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\SwiftmailerBundle\DataCollector; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\DataCollector\DataCollector; /** * MessageDataCollector. * * @author Fabien Potencier * @author Clément JOBEILI * @author Jérémy Romey */ final class MessageDataCollector extends DataCollector { private $container; /** * We don't inject the message logger and mailer here * to avoid the creation of these objects when no emails are sent. */ public function __construct(ContainerInterface $container) { $this->container = $container; } /** * {@inheritdoc} */ public function collect(Request $request, Response $response, \Throwable $exception = null) { $this->reset(); // only collect when Swiftmailer has already been initialized if (class_exists('Swift_Mailer', false)) { $mailers = $this->container->getParameter('swiftmailer.mailers'); foreach ($mailers as $name => $mailer) { if ($this->container->getParameter('swiftmailer.default_mailer') == $name) { $this->data['defaultMailer'] = $name; } $loggerName = sprintf('swiftmailer.mailer.%s.plugin.messagelogger', $name); if ($this->container->has($loggerName)) { $logger = $this->container->get($loggerName); $this->data['mailer'][$name] = [ 'messages' => [], 'messageCount' => $logger->countMessages(), 'isSpool' => $this->container->getParameter(sprintf('swiftmailer.mailer.%s.spool.enabled', $name)), ]; foreach ($logger->getMessages() as $message) { $message->__contentType = $message->getBodyContentType(); $message->__base64EncodedBody = base64_encode($message->getBody()); if ('text/plain' === $message->__contentType) { foreach ($message->getChildren() as $child) { if ('text/html' === $child->getContentType()) { $message->__contentType = 'text/html'; $message->__base64EncodedBody = base64_encode($child->getBody()); break; } } } $this->data['mailer'][$name]['messages'][] = $message; } $this->data['messageCount'] += $logger->countMessages(); } } } } /** * {@inheritdoc} */ public function reset() { $this->data = [ 'mailer' => [], 'messageCount' => 0, 'defaultMailer' => '', ]; } /** * Returns the mailer names. * * @return array the mailer names */ public function getMailers() { return array_keys($this->data['mailer']); } /** * Returns the data collected of a mailer. * * @return array the data of the mailer */ public function getMailerData($name) { if (!isset($this->data['mailer'][$name])) { throw new \LogicException(sprintf('Missing "%s" data in "%s".', $name, static::class)); } return $this->data['mailer'][$name]; } /** * Returns the message count of a mailer or the total. * * @return int the number of messages */ public function getMessageCount($name = null) { if (null === $name) { return $this->data['messageCount']; } elseif ($data = $this->getMailerData($name)) { return $data['messageCount']; } return; } /** * Returns the messages of a mailer. * * @return \Swift_Message[] the messages */ public function getMessages($name = 'default') { if ($data = $this->getMailerData($name)) { return $data['messages']; } return []; } /** * Returns if the mailer has spool. * * @return bool */ public function isSpool($name) { if ($data = $this->getMailerData($name)) { return $data['isSpool']; } return; } /** * Returns if the mailer is the default mailer. * * @return bool */ public function isDefaultMailer($name) { return $this->data['defaultMailer'] == $name; } public function extractAttachments(\Swift_Message $message) { $attachments = []; foreach ($message->getChildren() as $child) { if ($child instanceof \Swift_Attachment) { $attachments[] = $child; } } return $attachments; } /** * {@inheritdoc} */ public function getName() { return 'swiftmailer'; } }