vendor/symfony/mailer/EventListener/MessageListener.php line 64
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Mailer\EventListener;
- use Symfony\Component\EventDispatcher\EventSubscriberInterface;
- use Symfony\Component\Mailer\Event\MessageEvent;
- use Symfony\Component\Mailer\Exception\InvalidArgumentException;
- use Symfony\Component\Mailer\Exception\RuntimeException;
- use Symfony\Component\Mime\BodyRendererInterface;
- use Symfony\Component\Mime\Header\Headers;
- use Symfony\Component\Mime\Header\MailboxListHeader;
- use Symfony\Component\Mime\Message;
- /**
- * Manipulates the headers and the body of a Message.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class MessageListener implements EventSubscriberInterface
- {
- public const HEADER_SET_IF_EMPTY = 1;
- public const HEADER_ADD = 2;
- public const HEADER_REPLACE = 3;
- public const DEFAULT_RULES = [
- 'from' => self::HEADER_SET_IF_EMPTY,
- 'return-path' => self::HEADER_SET_IF_EMPTY,
- 'reply-to' => self::HEADER_ADD,
- 'to' => self::HEADER_SET_IF_EMPTY,
- 'cc' => self::HEADER_ADD,
- 'bcc' => self::HEADER_ADD,
- ];
- private ?Headers $headers;
- private array $headerRules = [];
- private ?BodyRendererInterface $renderer;
- public function __construct(Headers $headers = null, BodyRendererInterface $renderer = null, array $headerRules = self::DEFAULT_RULES)
- {
- $this->headers = $headers;
- $this->renderer = $renderer;
- foreach ($headerRules as $headerName => $rule) {
- $this->addHeaderRule($headerName, $rule);
- }
- }
- public function addHeaderRule(string $headerName, int $rule): void
- {
- if ($rule < 1 || $rule > 3) {
- throw new InvalidArgumentException(sprintf('The "%d" rule is not supported.', $rule));
- }
- $this->headerRules[strtolower($headerName)] = $rule;
- }
- public function onMessage(MessageEvent $event): void
- {
- $message = $event->getMessage();
- if (!$message instanceof Message) {
- return;
- }
- $this->setHeaders($message);
- $this->renderMessage($message);
- }
- private function setHeaders(Message $message): void
- {
- if (!$this->headers) {
- return;
- }
- $headers = $message->getHeaders();
- foreach ($this->headers->all() as $name => $header) {
- if (!$headers->has($name)) {
- $headers->add($header);
- continue;
- }
- switch ($this->headerRules[$name] ?? self::HEADER_SET_IF_EMPTY) {
- case self::HEADER_SET_IF_EMPTY:
- break;
- case self::HEADER_REPLACE:
- $headers->remove($name);
- $headers->add($header);
- break;
- case self::HEADER_ADD:
- if (!Headers::isUniqueHeader($name)) {
- $headers->add($header);
- break;
- }
- $h = $headers->get($name);
- if (!$h instanceof MailboxListHeader) {
- throw new RuntimeException(sprintf('Unable to set header "%s".', $name));
- }
- Headers::checkHeaderClass($header);
- foreach ($header->getAddresses() as $address) {
- $h->addAddress($address);
- }
- }
- }
- }
- private function renderMessage(Message $message): void
- {
- if (!$this->renderer) {
- return;
- }
- $this->renderer->render($message);
- }
- public static function getSubscribedEvents(): array
- {
- return [
- MessageEvent::class => 'onMessage',
- ];
- }
- }