Skip to content

Commit d404246

Browse files
committed
feature #47190 [Mailer] Add a way to change the Bus transport dynamically (fabpot)
This PR was merged into the 6.2 branch. Discussion ---------- [Mailer] Add a way to change the Bus transport dynamically | Q | A | ------------- | --- | Branch? | 6.2 | Bug fix? | no | New feature? | yes <!-- please update src/**/CHANGELOG.md files --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tickets | Fix #36348 <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead --> | License | MIT | Doc PR | This PR relies on #39306. Once merged, this PR will be rebased. This allows overriding the bus transport "dynamically" via the `X-Bus-Transport` header. Commits ------- ffe3600 [Mailer] Add a way to change the Bus transport dynamically
2 parents 475d4c0 + ffe3600 commit d404246

File tree

6 files changed

+122
-3
lines changed

6 files changed

+122
-3
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

+5
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
use Symfony\Component\Mailer\Bridge\Sendgrid\Transport\SendgridTransportFactory;
103103
use Symfony\Component\Mailer\Bridge\Sendinblue\Transport\SendinblueTransportFactory;
104104
use Symfony\Component\Mailer\Command\MailerTestCommand;
105+
use Symfony\Component\Mailer\EventListener\MessengerTransportListener;
105106
use Symfony\Component\Mailer\Mailer;
106107
use Symfony\Component\Mercure\HubRegistry;
107108
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
@@ -2486,6 +2487,10 @@ private function registerMailerConfiguration(array $config, ContainerBuilder $co
24862487
} else {
24872488
$container->removeDefinition('mailer.message_listener');
24882489
}
2490+
2491+
if (!class_exists(MessengerTransportListener::class)) {
2492+
$container->removeDefinition('mailer.messenger_transport_listener');
2493+
}
24892494
}
24902495

24912496
private function registerNotifierConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader)

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

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Mailer\EventListener\EnvelopeListener;
1616
use Symfony\Component\Mailer\EventListener\MessageListener;
1717
use Symfony\Component\Mailer\EventListener\MessageLoggerListener;
18+
use Symfony\Component\Mailer\EventListener\MessengerTransportListener;
1819
use Symfony\Component\Mailer\Mailer;
1920
use Symfony\Component\Mailer\MailerInterface;
2021
use Symfony\Component\Mailer\Messenger\MessageHandler;
@@ -74,6 +75,9 @@
7475
->tag('kernel.event_subscriber')
7576
->tag('kernel.reset', ['method' => 'reset'])
7677

78+
->set('mailer.messenger_transport_listener', MessengerTransportListener::class)
79+
->tag('kernel.event_subscriber')
80+
7781
->set('console.command.mailer_test', MailerTestCommand::class)
7882
->args([
7983
service('mailer.transports'),

src/Symfony/Bundle/FrameworkBundle/composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"symfony/html-sanitizer": "^6.1",
4848
"symfony/http-client": "^5.4|^6.0",
4949
"symfony/lock": "^5.4|^6.0",
50-
"symfony/mailer": "^5.4|^6.0",
50+
"symfony/mailer": "^6.2",
5151
"symfony/messenger": "^6.1",
5252
"symfony/mime": "^5.4|^6.0",
5353
"symfony/notifier": "^5.4|^6.0",
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\EventListener;
13+
14+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\Mailer\Event\QueuingMessageEvent;
16+
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
17+
use Symfony\Component\Mime\Message;
18+
19+
/**
20+
* Allows messages to be sent to specific Messenger transports via the "X-Bus-Transport" MIME header.
21+
*
22+
* @author Fabien Potencier <fabien@symfony.com>
23+
*/
24+
final class MessengerTransportListener implements EventSubscriberInterface
25+
{
26+
public function onMessage(QueuingMessageEvent $event): void
27+
{
28+
$message = $event->getMessage();
29+
if (!$message instanceof Message || !$message->getHeaders()->has('X-Bus-Transport')) {
30+
return;
31+
}
32+
33+
$names = $message->getHeaders()->get('X-Bus-Transport')->getBody();
34+
$names = array_map('trim', explode(',', $names));
35+
$event->addStamp(new TransportNamesStamp($names));
36+
$message->getHeaders()->remove('X-Bus-Transport');
37+
}
38+
39+
public static function getSubscribedEvents(): array
40+
{
41+
return [
42+
QueuingMessageEvent::class => 'onMessage',
43+
];
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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\Tests\EventListener;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Mailer\Envelope;
16+
use Symfony\Component\Mailer\Event\QueuingMessageEvent;
17+
use Symfony\Component\Mailer\EventListener\MessengerTransportListener;
18+
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
19+
use Symfony\Component\Mime\Address;
20+
use Symfony\Component\Mime\Header\Headers;
21+
use Symfony\Component\Mime\Message;
22+
23+
class MessengerTransportListenerTest extends TestCase
24+
{
25+
public function testNoMessengerTransportStampsByDefault()
26+
{
27+
$l = new MessengerTransportListener();
28+
$envelope = new Envelope(new Address('sender@example.com'), [new Address('recipient@example.com')]);
29+
$message = new Message(new Headers());
30+
$event = new QueuingMessageEvent($message, $envelope, 'smtp');
31+
$l->onMessage($event);
32+
$this->assertEmpty($event->getStamps());
33+
}
34+
35+
public function testMessengerTransportStampViaHeader()
36+
{
37+
$l = new MessengerTransportListener();
38+
$envelope = new Envelope(new Address('sender@example.com'), [new Address('recipient@example.com')]);
39+
$headers = (new Headers())->addTextHeader('X-Bus-Transport', 'async');
40+
$message = new Message($headers);
41+
$event = new QueuingMessageEvent($message, $envelope, 'smtp');
42+
$l->onMessage($event);
43+
$this->assertCount(1, $event->getStamps());
44+
/* @var TransportNamesStamp $stamp */
45+
$this->assertInstanceOf(TransportNamesStamp::class, $stamp = $event->getStamps()[0]);
46+
$this->assertSame(['async'], $stamp->getTransportNames());
47+
$this->assertTrue($headers->has('X-Bus-Transport'));
48+
}
49+
50+
public function testMessengerTransportStampsViaHeader()
51+
{
52+
$l = new MessengerTransportListener();
53+
$envelope = new Envelope(new Address('sender@example.com'), [new Address('recipient@example.com')]);
54+
$name = 'söme_very_long_and_weïrd transport name-for-messenger!';
55+
$headers = (new Headers())->addTextHeader('X-Bus-Transport', ' async , async1,'.$name);
56+
$message = new Message($headers);
57+
$event = new QueuingMessageEvent($message, $envelope, 'smtp');
58+
$l->onMessage($event);
59+
$this->assertCount(1, $event->getStamps());
60+
/* @var TransportNamesStamp $stamp */
61+
$this->assertInstanceOf(TransportNamesStamp::class, $stamp = $event->getStamps()[0]);
62+
$this->assertSame(['async', 'async1', $name], $stamp->getTransportNames());
63+
}
64+
}

src/Symfony/Component/Mailer/composer.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
"require-dev": {
2828
"symfony/console": "^5.4|^6.0",
2929
"symfony/http-client-contracts": "^1.1|^2|^3",
30-
"symfony/messenger": "^5.4|^6.0"
30+
"symfony/messenger": "^6.2"
3131
},
3232
"conflict": {
33-
"symfony/http-kernel": "<5.4"
33+
"symfony/http-kernel": "<5.4",
34+
"symfony/messenger": "<6.2"
3435
},
3536
"autoload": {
3637
"psr-4": { "Symfony\\Component\\Mailer\\": "" },

0 commit comments

Comments
 (0)