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

Breadcrumb

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

class SocketStream

A stream supporting remote sockets.

@author Fabien Potencier <fabien@symfony.com> @author Chris Corbyn

@internal

Hierarchy

  • class \Symfony\Component\Mailer\Transport\Smtp\Stream\AbstractStream
    • class \Symfony\Component\Mailer\Transport\Smtp\Stream\SocketStream extends \Symfony\Component\Mailer\Transport\Smtp\Stream\AbstractStream

Expanded class hierarchy of SocketStream

4 files declare their use of SocketStream
EsmtpTransport.php in vendor/symfony/mailer/Transport/Smtp/EsmtpTransport.php
EsmtpTransportFactory.php in vendor/symfony/mailer/Transport/Smtp/EsmtpTransportFactory.php
NativeTransportFactory.php in vendor/symfony/mailer/Transport/NativeTransportFactory.php
SmtpTransport.php in vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php

File

vendor/symfony/mailer/Transport/Smtp/Stream/SocketStream.php, line 24

Namespace

Symfony\Component\Mailer\Transport\Smtp\Stream
View source
final class SocketStream extends AbstractStream {
    private string $url;
    private string $host = 'localhost';
    private int $port = 465;
    private float $timeout;
    private bool $tls = true;
    private ?string $sourceIp = null;
    private array $streamContextOptions = [];
    
    /**
     * @return $this
     */
    public function setTimeout(float $timeout) : static {
        $this->timeout = $timeout;
        return $this;
    }
    public function getTimeout() : float {
        return $this->timeout ?? (double) \ini_get('default_socket_timeout');
    }
    
    /**
     * Literal IPv6 addresses should be wrapped in square brackets.
     *
     * @return $this
     */
    public function setHost(string $host) : static {
        $this->host = $host;
        return $this;
    }
    public function getHost() : string {
        return $this->host;
    }
    
    /**
     * @return $this
     */
    public function setPort(int $port) : static {
        $this->port = $port;
        return $this;
    }
    public function getPort() : int {
        return $this->port;
    }
    
    /**
     * Sets the TLS/SSL on the socket (disables STARTTLS).
     *
     * @return $this
     */
    public function disableTls() : static {
        $this->tls = false;
        return $this;
    }
    public function isTLS() : bool {
        return $this->tls;
    }
    
    /**
     * @return $this
     */
    public function setStreamOptions(array $options) : static {
        $this->streamContextOptions = $options;
        return $this;
    }
    public function getStreamOptions() : array {
        return $this->streamContextOptions;
    }
    
    /**
     * Sets the source IP.
     *
     * IPv6 addresses should be wrapped in square brackets.
     *
     * @return $this
     */
    public function setSourceIp(string $ip) : static {
        $this->sourceIp = $ip;
        return $this;
    }
    
    /**
     * Returns the IP used to connect to the destination.
     */
    public function getSourceIp() : ?string {
        return $this->sourceIp;
    }
    public function initialize() : void {
        $this->url = $this->host . ':' . $this->port;
        if ($this->tls) {
            $this->url = 'ssl://' . $this->url;
        }
        $options = [];
        if ($this->sourceIp) {
            $options['socket']['bindto'] = $this->sourceIp . ':0';
        }
        if ($this->streamContextOptions) {
            $options = array_merge($options, $this->streamContextOptions);
        }
        // do it unconditionally as it will be used by STARTTLS as well if supported
        $options['ssl']['crypto_method'] ??= \STREAM_CRYPTO_METHOD_TLS_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
        $streamContext = stream_context_create($options);
        $timeout = $this->getTimeout();
        set_error_handler(function ($type, $msg) {
            throw new TransportException(\sprintf('Connection could not be established with host "%s": ', $this->url) . $msg);
        });
        try {
            $this->stream = stream_socket_client($this->url, $errno, $errstr, $timeout, \STREAM_CLIENT_CONNECT, $streamContext);
        } finally {
            restore_error_handler();
        }
        stream_set_blocking($this->stream, true);
        stream_set_timeout($this->stream, (int) $timeout, (int) (($timeout - (int) $timeout) * 1000000));
        $this->in =& $this->stream;
        $this->out =& $this->stream;
    }
    public function startTLS() : bool {
        set_error_handler(function ($type, $msg) {
            throw new TransportException('Unable to connect with STARTTLS: ' . $msg);
        });
        try {
            return stream_socket_enable_crypto($this->stream, true);
        } finally {
            restore_error_handler();
        }
    }
    public function terminate() : void {
        if (null !== $this->stream) {
            fclose($this->stream);
        }
        parent::terminate();
    }
    protected function getReadConnectionDescription() : string {
        return $this->url;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
AbstractStream::$debug private property
AbstractStream::$err protected property
AbstractStream::$in protected property @var resource|null
AbstractStream::$out protected property @var resource|null
AbstractStream::$stream protected property @var resource|null
AbstractStream::flush public function Flushes the contents of the stream (empty it) and set the internal pointer to the beginning.
AbstractStream::getDebug public function
AbstractStream::readLine public function
AbstractStream::replace public static function
AbstractStream::write public function
SocketStream::$host private property
SocketStream::$port private property
SocketStream::$sourceIp private property
SocketStream::$streamContextOptions private property
SocketStream::$timeout private property
SocketStream::$tls private property
SocketStream::$url private property
SocketStream::disableTls public function Sets the TLS/SSL on the socket (disables STARTTLS).
SocketStream::getHost public function
SocketStream::getPort public function
SocketStream::getReadConnectionDescription protected function Overrides AbstractStream::getReadConnectionDescription
SocketStream::getSourceIp public function Returns the IP used to connect to the destination.
SocketStream::getStreamOptions public function
SocketStream::getTimeout public function
SocketStream::initialize public function Performs any initialization needed. Overrides AbstractStream::initialize
SocketStream::isTLS public function
SocketStream::setHost public function Literal IPv6 addresses should be wrapped in square brackets.
SocketStream::setPort public function
SocketStream::setSourceIp public function Sets the source IP.
SocketStream::setStreamOptions public function
SocketStream::setTimeout public function
SocketStream::startTLS public function
SocketStream::terminate public function Overrides AbstractStream::terminate
RSS feed
Powered by Drupal