Skip to content

Commit 9af7d94

Browse files
committed
Add transport factories (closes #31385)
1 parent 9d7e9fc commit 9af7d94

File tree

15 files changed

+733
-4
lines changed

15 files changed

+733
-4
lines changed

src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.xml

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,62 @@
1212
<service id="mailer" alias="mailer.mailer" />
1313
<service id="Symfony\Component\Mailer\MailerInterface" alias="mailer.mailer" />
1414

15+
<service id="mailer.transport_factory" class="Symfony\Component\Mailer\TransportFactory">
16+
<argument type="tagged_iterator" tag="mailer.transport_factory" />
17+
</service>
18+
1519
<service id="mailer.default_transport" class="Symfony\Component\Mailer\Transport\TransportInterface">
16-
<factory class="Symfony\Component\Mailer\Transport" method="fromDsn" />
20+
<factory service="mailer.transport_factory" method="fromString" />
1721
<argument /> <!-- env(MAILER_DSN) -->
18-
<argument type="service" id="event_dispatcher" />
19-
<argument type="service" id="http_client" on-invalid="ignore" />
20-
<argument type="service" id="logger" on-invalid="ignore" />
2122
</service>
2223
<service id="Symfony\Component\Mailer\Transport\TransportInterface" alias="mailer.default_transport" />
2324

2425
<service id="mailer.messenger.message_handler" class="Symfony\Component\Mailer\Messenger\MessageHandler">
2526
<argument type="service" id="mailer.default_transport" />
2627
<tag name="messenger.message_handler" />
2728
</service>
29+
30+
<!-- transports -->
31+
<service id="mailer.transport_factory.abstract" class="Symfony\Component\Mailer\Transport\AbstractTransportFactory" abstract="true">
32+
<argument type="service" id="event_dispatcher" />
33+
<argument type="service" id="http_client" on-invalid="ignore" />
34+
<argument type="service" id="logger" on-invalid="ignore" />
35+
</service>
36+
37+
<service id="mailer.transport_factory.amazon" class="Symfony\Component\Mailer\Bridge\Amazon\Factory\SesTransportFactory" parent="mailer.transport_factory.abstract">
38+
<tag name="mailer.transport_factory" />
39+
</service>
40+
41+
<service id="mailer.transport_factory.gmail" class="Symfony\Component\Mailer\Bridge\Google\Factory\GmailTransportFactory" parent="mailer.transport_factory.abstract">
42+
<tag name="mailer.transport_factory" />
43+
</service>
44+
45+
<service id="mailer.transport_factory.mailchimp" class="Symfony\Component\Mailer\Bridge\Mailchimp\Factory\MandrillTransportFactory" parent="mailer.transport_factory.abstract">
46+
<tag name="mailer.transport_factory" />
47+
</service>
48+
49+
<service id="mailer.transport_factory.mailgun" class="Symfony\Component\Mailer\Bridge\Mailgun\Factory\MailgunTransportFactory" parent="mailer.transport_factory.abstract">
50+
<tag name="mailer.transport_factory" />
51+
</service>
52+
53+
<service id="mailer.transport_factory.postmark" class="Symfony\Component\Mailer\Bridge\Postmark\Factory\PostmarkTransportFactory" parent="mailer.transport_factory.abstract">
54+
<tag name="mailer.transport_factory" />
55+
</service>
56+
57+
<service id="mailer.transport_factory.sendgrid" class="Symfony\Component\Mailer\Bridge\Sendgrid\Factory\SendgridTransportFactory" parent="mailer.transport_factory.abstract">
58+
<tag name="mailer.transport_factory" />
59+
</service>
60+
61+
<service id="mailer.transport_factory.null" class="Symfony\Component\Mailer\Transport\NullTransportFactory" parent="mailer.transport_factory.abstract">
62+
<tag name="mailer.transport_factory" />
63+
</service>
64+
65+
<service id="mailer.transport_factory.sendmail" class="Symfony\Component\Mailer\Transport\SendmailTransportFactory" parent="mailer.transport_factory.abstract">
66+
<tag name="mailer.transport_factory" />
67+
</service>
68+
69+
<service id="mailer.transport_factory.smtp" class="Symfony\Component\Mailer\Transport\Smtp\EsmtpTransportFactory" parent="mailer.transport_factory.abstract">
70+
<tag name="mailer.transport_factory" priority="-100" />
71+
</service>
2872
</services>
2973
</container>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Amazon\Factory;
13+
14+
use Symfony\Component\Mailer\Bridge\Amazon;
15+
use Symfony\Component\Mailer\Exception\InvalidDsnException;
16+
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
17+
use Symfony\Component\Mailer\Transport\Dsn;
18+
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
20+
/**
21+
* @author Konstantin Myakshin <molodchick@gmail.com>
22+
*/
23+
class SesTransportFactory extends AbstractTransportFactory
24+
{
25+
public function create(Dsn $dsn): TransportInterface
26+
{
27+
$scheme = $dsn->getScheme();
28+
$user = $dsn->getUser();
29+
$pass = $dsn->getPass();
30+
$region = $dsn->getOption('region');
31+
32+
if ('smtp' === $scheme) {
33+
return new Amazon\Smtp\SesTransport($user, $pass, $region, $this->dispatcher, $this->logger);
34+
}
35+
36+
if ('api' === $scheme) {
37+
return new Amazon\Http\Api\SesTransport($user, $pass, $region, $this->client, $this->dispatcher, $this->logger);
38+
}
39+
40+
if ('http' === $scheme) {
41+
return new Amazon\Http\SesTransport($user, $pass, $region, $this->client, $this->dispatcher, $this->logger);
42+
}
43+
44+
throw InvalidDsnException::unsupportedScheme($dsn);
45+
}
46+
47+
public function supports(Dsn $dsn): bool
48+
{
49+
return 'ses' === $dsn->getHost();
50+
}
51+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Google\Factory;
13+
14+
use Symfony\Component\Mailer\Bridge\Google\Smtp\GmailTransport;
15+
use Symfony\Component\Mailer\Exception\InvalidDsnException;
16+
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
17+
use Symfony\Component\Mailer\Transport\Dsn;
18+
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
20+
/**
21+
* @author Konstantin Myakshin <molodchick@gmail.com>
22+
*/
23+
class GmailTransportFactory extends AbstractTransportFactory
24+
{
25+
public function create(Dsn $dsn): TransportInterface
26+
{
27+
if ('smtp' === $dsn->getScheme()) {
28+
return new GmailTransport($dsn->getUser(), $dsn->getPass(), $this->dispatcher, $this->logger);
29+
}
30+
31+
throw InvalidDsnException::unsupportedScheme($dsn);
32+
}
33+
34+
public function supports(Dsn $dsn): bool
35+
{
36+
return 'gmail' === $dsn->getHost();
37+
}
38+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Mailchimp\Factory;
13+
14+
use Symfony\Component\Mailer\Bridge\Mailchimp;
15+
use Symfony\Component\Mailer\Exception\InvalidDsnException;
16+
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
17+
use Symfony\Component\Mailer\Transport\Dsn;
18+
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
20+
/**
21+
* @author Konstantin Myakshin <molodchick@gmail.com>
22+
*/
23+
class MandrillTransportFactory extends AbstractTransportFactory
24+
{
25+
public function create(Dsn $dsn): TransportInterface
26+
{
27+
$scheme = $dsn->getScheme();
28+
$user = $dsn->getUser();
29+
30+
if ('smtp' === $scheme) {
31+
return new Mailchimp\Smtp\MandrillTransport($user, $dsn->getPass(), $this->dispatcher, $this->logger);
32+
}
33+
34+
if ('api' === $scheme) {
35+
return new Mailchimp\Http\Api\MandrillTransport($user, $this->client, $this->dispatcher, $this->logger);
36+
}
37+
38+
if ('http' === $scheme) {
39+
return new Mailchimp\Http\MandrillTransport($user, $this->client, $this->dispatcher, $this->logger);
40+
}
41+
42+
throw InvalidDsnException::unsupportedScheme($dsn);
43+
}
44+
45+
public function supports(Dsn $dsn): bool
46+
{
47+
return 'mandrill' === $dsn->getHost();
48+
}
49+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Mailgun\Factory;
13+
14+
use Symfony\Component\Mailer\Bridge\Mailgun;
15+
use Symfony\Component\Mailer\Exception\InvalidDsnException;
16+
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
17+
use Symfony\Component\Mailer\Transport\Dsn;
18+
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
20+
/**
21+
* @author Konstantin Myakshin <molodchick@gmail.com>
22+
*/
23+
class MailgunTransportFactory extends AbstractTransportFactory
24+
{
25+
public function create(Dsn $dsn): TransportInterface
26+
{
27+
$scheme = $dsn->getScheme();
28+
$user = $dsn->getUser();
29+
$pass = $dsn->getPass();
30+
31+
if ('smtp' === $scheme) {
32+
return new Mailgun\Smtp\MailgunTransport($user, $pass, $this->dispatcher, $this->logger);
33+
}
34+
35+
if ('http' === $scheme) {
36+
return new Mailgun\Http\MailgunTransport($user, $pass, $this->client, $this->dispatcher, $this->logger);
37+
}
38+
39+
if ('api' === $scheme) {
40+
return new Mailgun\Http\Api\MailgunTransport($user, $pass, $this->client, $this->dispatcher, $this->logger);
41+
}
42+
43+
throw InvalidDsnException::unsupportedScheme($dsn);
44+
}
45+
46+
public function supports(Dsn $dsn): bool
47+
{
48+
return 'mailgun' === $dsn->getHost();
49+
}
50+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Postmark\Factory;
13+
14+
use Symfony\Component\Mailer\Bridge\Postmark;
15+
use Symfony\Component\Mailer\Exception\InvalidDsnException;
16+
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
17+
use Symfony\Component\Mailer\Transport\Dsn;
18+
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
20+
/**
21+
* @author Konstantin Myakshin <molodchick@gmail.com>
22+
*/
23+
class PostmarkTransportFactory extends AbstractTransportFactory
24+
{
25+
public function create(Dsn $dsn): TransportInterface
26+
{
27+
$scheme = $dsn->getScheme();
28+
$user = $dsn->getUser();
29+
30+
if ('smtp' === $scheme) {
31+
return new Postmark\Smtp\PostmarkTransport($user, $this->dispatcher, $this->logger);
32+
}
33+
34+
if ('api' === $scheme) {
35+
return new Postmark\Http\Api\PostmarkTransport($user, $this->client, $this->dispatcher, $this->logger);
36+
}
37+
38+
throw InvalidDsnException::unsupportedScheme($dsn);
39+
}
40+
41+
public function supports(Dsn $dsn): bool
42+
{
43+
return 'postmark' === $dsn->getHost();
44+
}
45+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Sendgrid\Factory;
13+
14+
use Symfony\Component\Mailer\Bridge\Sendgrid;
15+
use Symfony\Component\Mailer\Exception\InvalidDsnException;
16+
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
17+
use Symfony\Component\Mailer\Transport\Dsn;
18+
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
20+
/**
21+
* @author Konstantin Myakshin <molodchick@gmail.com>
22+
*/
23+
class SendgridTransportFactory extends AbstractTransportFactory
24+
{
25+
public function create(Dsn $dsn): TransportInterface
26+
{
27+
if ('smtp' === $dsn->getScheme()) {
28+
return new Sendgrid\Smtp\SendgridTransport($dsn->getUser(), $this->dispatcher, $this->logger);
29+
}
30+
31+
if ('api' === $dsn->getScheme()) {
32+
return new Sendgrid\Http\Api\SendgridTransport($dsn->getUser(), $this->client, $this->dispatcher, $this->logger);
33+
}
34+
35+
throw InvalidDsnException::unsupportedScheme($dsn);
36+
}
37+
38+
public function supports(Dsn $dsn): bool
39+
{
40+
return 'sendgrid' === $dsn->getHost();
41+
}
42+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy