EsmtpTransportFactory.php 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\Mailer\Transport\Smtp;
  11. use Symfony\Component\Mailer\Exception\UnsupportedSchemeException;
  12. use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
  13. use Symfony\Component\Mailer\Transport\Dsn;
  14. use Symfony\Component\Mailer\Transport\Smtp\Stream\SocketStream;
  15. use Symfony\Component\Mailer\Transport\TransportInterface;
  16. /**
  17. * @author Konstantin Myakshin <molodchick@gmail.com>
  18. */
  19. final class EsmtpTransportFactory extends AbstractTransportFactory
  20. {
  21. public function create(Dsn $dsn): TransportInterface
  22. {
  23. if (!\in_array($dsn->getScheme(), $this->getSupportedSchemes(), true)) {
  24. throw new UnsupportedSchemeException($dsn, 'smtp', $this->getSupportedSchemes());
  25. }
  26. $autoTls = '' === $dsn->getOption('auto_tls') || filter_var($dsn->getOption('auto_tls', true), \FILTER_VALIDATE_BOOL);
  27. $tls = 'smtps' === $dsn->getScheme() ? true : ($autoTls ? null : false);
  28. $port = $dsn->getPort(0);
  29. $host = $dsn->getHost();
  30. $transport = new EsmtpTransport($host, $port, $tls, $this->dispatcher, $this->logger);
  31. $transport->setAutoTls($autoTls);
  32. $transport->setRequireTls($dsn->getBooleanOption('require_tls'));
  33. /** @var SocketStream $stream */
  34. $stream = $transport->getStream();
  35. if ('' !== $sourceIp = $dsn->getOption('source_ip', '')) {
  36. $stream->setSourceIp($sourceIp);
  37. }
  38. $streamOptions = $stream->getStreamOptions();
  39. if ('' !== $dsn->getOption('verify_peer') && !filter_var($dsn->getOption('verify_peer', true), \FILTER_VALIDATE_BOOL)) {
  40. $streamOptions['ssl']['verify_peer'] = false;
  41. $streamOptions['ssl']['verify_peer_name'] = false;
  42. }
  43. if (null !== $peerFingerprint = $dsn->getOption('peer_fingerprint')) {
  44. $streamOptions['ssl']['peer_fingerprint'] = $peerFingerprint;
  45. }
  46. $stream->setStreamOptions($streamOptions);
  47. if ($user = $dsn->getUser()) {
  48. $transport->setUsername($user);
  49. }
  50. if ($password = $dsn->getPassword()) {
  51. $transport->setPassword($password);
  52. }
  53. if (null !== ($localDomain = $dsn->getOption('local_domain'))) {
  54. $transport->setLocalDomain($localDomain);
  55. }
  56. if (null !== ($maxPerSecond = $dsn->getOption('max_per_second'))) {
  57. $transport->setMaxPerSecond((float) $maxPerSecond);
  58. }
  59. if (null !== ($restartThreshold = $dsn->getOption('restart_threshold'))) {
  60. $transport->setRestartThreshold((int) $restartThreshold, (int) $dsn->getOption('restart_threshold_sleep', 0));
  61. }
  62. if (null !== ($pingThreshold = $dsn->getOption('ping_threshold'))) {
  63. $transport->setPingThreshold((int) $pingThreshold);
  64. }
  65. return $transport;
  66. }
  67. protected function getSupportedSchemes(): array
  68. {
  69. return ['smtp', 'smtps'];
  70. }
  71. }