Вход Регистрация
Файл: vendor/symfony/mailer/EventListener/MessageListener.php
Строк: 135
<?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 SymfonyComponentMailerEventListener;

use 
SymfonyComponentEventDispatcherEventSubscriberInterface;
use 
SymfonyComponentMailerEventMessageEvent;
use 
SymfonyComponentMailerExceptionInvalidArgumentException;
use 
SymfonyComponentMailerExceptionRuntimeException;
use 
SymfonyComponentMimeBodyRendererInterface;
use 
SymfonyComponentMimeHeaderHeaders;
use 
SymfonyComponentMimeHeaderMailboxListHeader;
use 
SymfonyComponentMimeMessage;

/**
 * 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 $headerNameint $rule): void
    
{
        if (
$rule || $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',
        ];
    }
}
Онлайн: 0
Реклама