Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. AbstractTransport.php

class AbstractTransport

@author Fabien Potencier <fabien@symfony.com>

Hierarchy

  • class \Symfony\Component\Mailer\Transport\AbstractTransport implements \Symfony\Component\Mailer\Transport\TransportInterface

Expanded class hierarchy of AbstractTransport

1 file declares its use of AbstractTransport
SmtpTransport.php in vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php

File

vendor/symfony/mailer/Transport/AbstractTransport.php, line 31

Namespace

Symfony\Component\Mailer\Transport
View source
abstract class AbstractTransport implements TransportInterface {
    private LoggerInterface $logger;
    private float $rate = 0;
    private float $lastSent = 0;
    public function __construct(?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) {
        $this->logger = $logger ?? new NullLogger();
    }
    
    /**
     * Sets the maximum number of messages to send per second (0 to disable).
     *
     * @return $this
     */
    public function setMaxPerSecond(float $rate) : static {
        if (0 >= $rate) {
            $rate = 0;
        }
        $this->rate = $rate;
        $this->lastSent = 0;
        return $this;
    }
    public function send(RawMessage $message, ?Envelope $envelope = null) : ?SentMessage {
        $message = clone $message;
        $envelope = null !== $envelope ? clone $envelope : Envelope::create($message);
        try {
            if (!$this->dispatcher) {
                $sentMessage = new SentMessage($message, $envelope);
                $this->doSend($sentMessage);
                return $sentMessage;
            }
            $event = new MessageEvent($message, $envelope, (string) $this);
            $this->dispatcher
                ->dispatch($event);
            if ($event->isRejected()) {
                return null;
            }
            $envelope = $event->getEnvelope();
            $message = $event->getMessage();
            if ($message instanceof TemplatedEmail && !$message->isRendered()) {
                throw new LogicException(\sprintf('You must configure a "%s" when a "%s" instance has a text or HTML template set.', BodyRendererInterface::class, get_debug_type($message)));
            }
            $sentMessage = new SentMessage($message, $envelope);
            try {
                $this->doSend($sentMessage);
            } catch (\Throwable $error) {
                $this->dispatcher
                    ->dispatch(new FailedMessageEvent($message, $error));
                $this->checkThrottling();
                throw $error;
            }
            $this->dispatcher
                ->dispatch(new SentMessageEvent($sentMessage));
            return $sentMessage;
        } finally {
            $this->checkThrottling();
        }
    }
    protected abstract function doSend(SentMessage $message) : void;
    
    /**
     * @param Address[] $addresses
     *
     * @return string[]
     */
    protected function stringifyAddresses(array $addresses) : array {
        return array_map(fn(Address $a) => $a->toString(), $addresses);
    }
    protected function getLogger() : LoggerInterface {
        return $this->logger;
    }
    private function checkThrottling() : void {
        if (0 == $this->rate) {
            return;
        }
        $sleep = 1 / $this->rate - (microtime(true) - $this->lastSent);
        if (0 < $sleep) {
            $this->logger
                ->debug(\sprintf('Email transport "%s" sleeps for %.2f seconds', __CLASS__, $sleep));
            usleep((int) ($sleep * 1000000));
        }
        $this->lastSent = microtime(true);
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
AbstractTransport::$lastSent private property
AbstractTransport::$logger private property
AbstractTransport::$rate private property
AbstractTransport::checkThrottling private function
AbstractTransport::doSend abstract protected function 4
AbstractTransport::getLogger protected function
AbstractTransport::send public function Overrides TransportInterface::send 2
AbstractTransport::setMaxPerSecond public function Sets the maximum number of messages to send per second (0 to disable).
AbstractTransport::stringifyAddresses protected function
AbstractTransport::__construct public function 3

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal