diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md b/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md index 67c32a2d7ebd4..4a068489286f3 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.2 +--- + + * Add support for region in DSN + 6.4 --- diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/README.md b/src/Symfony/Component/Mailer/Bridge/Sendgrid/README.md index a059eb4e90ed5..8f97d4ea08bd5 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/README.md +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/README.md @@ -7,15 +7,15 @@ Configuration example: ```env # SMTP -MAILER_DSN=sendgrid+smtp://KEY@default +MAILER_DSN=sendgrid+smtp://KEY@default?region=REGION # API -MAILER_DSN=sendgrid+api://KEY@default +MAILER_DSN=sendgrid+api://KEY@default?region=REGION ``` where: - `KEY` is your Sendgrid API Key - + - `REGION` is Sendgrid selected region (default to global) Webhook ------- diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php index 4196d0897172f..37dd4598cbaeb 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php @@ -39,6 +39,10 @@ public static function getTransportData() new SendgridApiTransport('KEY'), 'sendgrid+api://api.sendgrid.com', ], + [ + new SendgridApiTransport('KEY', null, null, null, 'eu'), + 'sendgrid+api://api.eu.sendgrid.com', + ], [ (new SendgridApiTransport('KEY'))->setHost('example.com'), 'sendgrid+api://example.com', diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridTransportFactoryTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridTransportFactoryTest.php index 433e905add6c5..b41d23941b380 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridTransportFactoryTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridTransportFactoryTest.php @@ -57,16 +57,22 @@ public static function supportsProvider(): iterable public static function createProvider(): iterable { + $client = new MockHttpClient(); $logger = new NullLogger(); yield [ new Dsn('sendgrid+api', 'default', self::USER), - new SendgridApiTransport(self::USER, new MockHttpClient(), null, $logger), + new SendgridApiTransport(self::USER, $client, null, $logger), + ]; + + yield [ + new Dsn('sendgrid+api', 'default', self::USER, '', null, ['region' => 'eu']), + new SendgridApiTransport(self::USER, $client, null, $logger, 'eu'), ]; yield [ new Dsn('sendgrid+api', 'example.com', self::USER, '', 8080), - (new SendgridApiTransport(self::USER, new MockHttpClient(), null, $logger))->setHost('example.com')->setPort(8080), + (new SendgridApiTransport(self::USER, $client, null, $logger))->setHost('example.com')->setPort(8080), ]; yield [ diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php index 422b942cd217f..5e4214e8c5429 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php @@ -32,13 +32,14 @@ */ class SendgridApiTransport extends AbstractApiTransport { - private const HOST = 'api.sendgrid.com'; + private const HOST = 'api.%region_dot%sendgrid.com'; public function __construct( #[\SensitiveParameter] private string $key, ?HttpClientInterface $client = null, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null, + private ?string $region = null ) { parent::__construct($client, $dispatcher, $logger); } @@ -190,6 +191,11 @@ private function getAttachments(Email $email): array private function getEndpoint(): ?string { - return ($this->host ?: self::HOST).($this->port ? ':'.$this->port : ''); + $host = $this->host ?: str_replace('%region_dot%', '', self::HOST); + if (null !== $this->region && null === $this->host) { + $host = str_replace('%region_dot%', $this->region.'.', self::HOST); + } + + return $host.($this->port ? ':'.$this->port : ''); } } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php index 647e202fa0073..d939359ff8bc0 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php @@ -20,9 +20,9 @@ */ class SendgridSmtpTransport extends EsmtpTransport { - public function __construct(#[\SensitiveParameter] string $key, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) + public function __construct(#[\SensitiveParameter] string $key, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null, private ?string $region = null) { - parent::__construct('smtp.sendgrid.net', 465, true, $dispatcher, $logger); + parent::__construct('null' !== $region ? \sprintf('smtp.%s.sendgrid.net', $region) : 'smtp.sendgrid.net', 465, true, $dispatcher, $logger); $this->setUsername('apikey'); $this->setPassword($key); diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridTransportFactory.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridTransportFactory.php index 22f56cbc857c6..1405538ab36ba 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridTransportFactory.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridTransportFactory.php @@ -25,16 +25,17 @@ public function create(Dsn $dsn): TransportInterface { $scheme = $dsn->getScheme(); $key = $this->getUser($dsn); + $region = $dsn->getOption('region'); if ('sendgrid+api' === $scheme) { $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); $port = $dsn->getPort(); - return (new SendgridApiTransport($key, $this->client, $this->dispatcher, $this->logger))->setHost($host)->setPort($port); + return (new SendgridApiTransport($key, $this->client, $this->dispatcher, $this->logger, $region))->setHost($host)->setPort($port); } if ('sendgrid+smtp' === $scheme || 'sendgrid+smtps' === $scheme || 'sendgrid' === $scheme) { - return new SendgridSmtpTransport($key, $this->dispatcher, $this->logger); + return new SendgridSmtpTransport($key, $this->dispatcher, $this->logger, $region); } throw new UnsupportedSchemeException($dsn, 'sendgrid', $this->getSupportedSchemes());