8000 feature #32927 [Mailer] Add message events logger (fabpot) · symfony/symfony@aa93f0b · GitHub
[go: up one dir, main page]

Skip to content

Commit aa93f0b

Browse files
committed
feature #32927 [Mailer] Add message events logger (fabpot)
This PR was merged into the 4.4 branch. Discussion ---------- [Mailer] Add message events logger | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | no | New feature? | yes | BC breaks? | no <!-- see https://symfony.com/bc --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tests pass? | yes <!-- please add some, will be required by reviewers --> | Fixed tickets | refs #31592, refs #32409, refs #31947, refs #31747 | License | MIT | Doc PR | n/a To allow testing emails and for the web profiler, we need a way to store all sent/queued messages. Commits ------- 7642178 [Mailer] added message events logger
2 parents 6cc20ba + 7642178 commit aa93f0b

File tree

9 files changed

+159
-4
lines changed

9 files changed

+159
-4
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,10 @@ private function registerProfilerConfiguration(array $config, ContainerBuilder $
553553
$loader->load('messenger_debug.xml');
554554
}
555555

556+
if (class_exists(Mailer::class)) {
557+
$loader->load('mailer_debug.xml');
558+
}
559+
556560
$container->setParameter('profiler_listener.only_exceptions', $config['only_exceptions']);
557561
$container->setParameter('profiler_listener.only_master_requests', $config['only_master_requests']);
558562

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
6+
7+
<services>
8+
<service id="mailer.logger_message_listener" class="Symfony\Component\Mailer\EventListener\MessageLoggerListener">
9+
<tag name="kernel.event_subscriber"/>
10+
</service>
11+
</services>
12+
</container>

src/Symfony/Component/Mailer/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
4.4.0
55
-----
66

7+
* Added `MessageEvents` and `MessageLoggerListener` to allow collecting sent emails
78
* [BC BREAK] `TransportInterface` has a new `getName()` method
89
* [BC BREAK] Classes `AbstractApiTransport` and `AbstractHttpTransport` moved under `Transport` sub-namespace.
910
* [BC BREAK] Transports depend on `Symfony\Contracts\EventDispatcher\EventDispatcherInterface`

src/Symfony/Component/Mailer/Event/MessageEvent.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,23 @@
1616
use Symfony\Component\Mime\RawMessage;
1717

1818
/**
19-
* Allows the transformation of a Message.
19+
* Allows the transformation of a Message and the SMTP Envelope before the email is sent.
2020
*
2121
* @author Fabien Potencier <fabien@symfony.com>
2222
*/
2323
class MessageEvent extends Event
2424
{
2525
private $message;
2626
private $envelope;
27+
private $transportName;
28+
private $queued;
2729

28-
public function __construct(RawMessage $message, SmtpEnvelope $envelope)
30+
public function __construct(RawMessage $message, SmtpEnvelope $envelope, string $transportName, bool $queued = false)
2931
{
3032
$this->message = $message;
3133
$this->envelope = $envelope;
34+
$this->transportName = $transportName;
35+
$this->queued = $queued;
3236
}
3337

3438
public function getMessage(): RawMessage
@@ -50,4 +54,14 @@ public function setEnvelope(SmtpEnvelope $envelope): void
5054
{
5155
$this->envelope = $envelope;
5256
}
57+
58+
public function getTransportName(): string
59+
{
60+
return $this->transportName;
61+
}
62+
63+
public function isQueued(): bool
64+
{
65+
return $this->queued;
66+
}
5367
}
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\Event;
13+
14+
/**
15+
* @author Fabien Potencier <fabien@symfony.com>
16+
*/
17+
class MessageEvents
18+
{
19+
private $events = [];
20+
private $transports = [];
21+
22+
public function add(MessageEvent $event): void
23+
{
24+
$this->events[] = $event;
25+
$this->transports[$event->getTransportName()] = true;
26+
}
27+
28+
public function getTransports(): array
29+
{
30+
return array_keys($this->transports);
31+
}
32+
33+
/**
34+
* @return MessageEvent[]
35+
*/
36+
public function getEvents(string $name = null): array
37+
{
38+
if (null === $name) {
39+
return $this->events;
40+
}
41+
42+
$events = [];
43+
foreach ($this->events as $event) {
44+
if ($name === $event->getTransportName()) {
45+
$events[] = $event;
46+
}
47+
}
48+
49+
return $events;
50+
}
51+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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\MessageEvent;
16+
use Symfony\Component\Mailer\Event\MessageEvents;
17+
use Symfony\Contracts\Service\ResetInterface;
18+
19+
/**
20+
* Logs Messages.
21+
*
22+
* @author Fabien Potencier <fabien@symfony.com>
23+
*/
24+
class MessageLoggerListener implements EventSubscriberInterface, ResetInterface
25+
{
26+
private $events;
27+
28+
public function __construct()
29+
{
30+
$this->events = new MessageEvents();
31+
}
32+
33+
/**
34+
* {@inheritdoc}
35+
*/
36+
public function reset()
37+
{
38+
$this->events = new MessageEvents();
39+
}
40+
41+
public function onMessage(MessageEvent $event): void
42+
{
43+
$this->events->add($event);
44+
}
45+
46+
public function getEvents(): MessageEvents
47+
{
48+
return $this->events;
49+
}
50+
51+
public static function getSubscribedEvents()
52+
{
53+
return [
54+
MessageEvent::class => ['onMessage', -255],
55+
];
56+
}
57+
}

src/Symfony/Component/Mailer/Mailer.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Mailer;
1313

14+
use Symfony\Component\Mailer\Event\MessageEvent;
15+
use Symfony\Component\Mailer\Exception\TransportException;
1416
use Symfony\Component\Mailer\Messenger\SendEmailMessage;
1517
use Symfony\Component\Mailer\Transport\TransportInterface;
1618
use Symfony\Component\Messenger\MessageBusInterface;
@@ -38,6 +40,19 @@ public function send(RawMessage $message, SmtpEnvelope $envelope = null): void
3840
return;
3941
}
4042

43+
$message = clone $message;
44+
if (null !== $envelope) {
45+
$envelope = clone $envelope;
46+
} else {
47+
try {
48+
$envelope = new DelayedSmtpEnvelope($message);
49+
} catch (\Exception $e) {
50+
throw new TransportException('Cannot send message without a valid envelope.', 0, $e);
51+
}
52+
}
53+
$event = new MessageEvent($message, $envelope, $this->transport->getName());
54+
$this->dispatcher->dispatch($event);
55+
4156
$this->bus->dispatch(new SendEmailMessage($message, $envelope));
4257
}
4358
}

src/Symfony/Component/Mailer/Transport/AbstractTransport.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public function send(RawMessage $message, SmtpEnvelope $envelope = null): ?SentM
6969
}
7070
}
7171

72-
$event = new MessageEvent($message, $envelope);
72+
$event = new MessageEvent($message, $envelope, $this->getName(), true);
7373
$this->dispatcher->dispatch($event);
7474
$envelope = $event->getEnvelope();
7575
if (!$envelope->getRecipients()) {

src/Symfony/Component/Mailer/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"egulias/email-validator": "^2.0",
2121
"psr/log": "~1.0",
2222
"symfony/event-dispatcher": "^4.3",
23-
"symfony/mime": "^4.3.3|^5.0"
23+
"symfony/mime": "^4.3.3|^5.0",
24+
"symfony/service-contracts": "^1.1"
2425
},
2526
"require-dev": {
2627
"symfony/amazon-mailer": "^4.4|^5.0",

0 commit comments

Comments
 (0)
0