Skip to content

Commit 677f34a

Browse files
committed
include message id provided by the MTA when dispatching the SentMessageEvent
1 parent b2c840d commit 677f34a

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

Tests/Transport/Smtp/DummyStream.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public function write(string $bytes, $debug = true): void
7777
} elseif (str_starts_with($bytes, 'QUIT')) {
7878
$this->nextResponse = '221 Goodbye';
7979
} else {
80-
$this->nextResponse = '250 OK';
80+
$this->nextResponse = '250 OK queued as 000501c4054c';
8181
}
8282
}
8383

Tests/Transport/Smtp/SmtpTransportTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Mailer\Envelope;
16+
use Symfony\Component\Mailer\Event\MessageEvent;
17+
use Symfony\Component\Mailer\Event\SentMessageEvent;
1618
use Symfony\Component\Mailer\Exception\LogicException;
1719
use Symfony\Component\Mailer\Exception\TransportException;
1820
use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport;
@@ -24,6 +26,7 @@
2426
use Symfony\Component\Mime\Part\DataPart;
2527
use Symfony\Component\Mime\Part\File;
2628
use Symfony\Component\Mime\RawMessage;
29+
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
2730

2831
/**
2932
* @group time-sensitive
@@ -137,6 +140,37 @@ public function testWriteEncodedRecipientAndSenderAddresses()
137140
$this->assertContains("RCPT TO:<recipient2@example.org>\r\n", $stream->getCommands());
138141
}
139142

143+
public function testMessageIdFromServerIsEmbeddedInSentMessageEvent()
144+
{
145+
$calls = 0;
146+
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
147+
$eventDispatcher->expects($this->any())
148+
->method('dispatch')
149+
->with($this->callback(static function ($event) use (&$calls): bool {
150+
++$calls;
151+
152+
if (1 === $calls && $event instanceof MessageEvent) {
153+
return true;
154+
}
155+
156+
if (2 === $calls && $event instanceof SentMessageEvent && '000501c4054c' === $event->getMessage()->getMessageId()) {
157+
return true;
158+
}
159+
160+
return false;
161+
}));
162+
$transport = new SmtpTransport(new DummyStream(), $eventDispatcher);
163+
164+
$email = new Email();
165+
$email->from('sender@example.com');
166+
$email->to('recipient@example.com');
167+
$email->text('.');
168+
169+
$transport->send($email);
170+
171+
$this->assertSame(2, $calls);
172+
}
173+
140174
public function testAssertResponseCodeNoCodes()
141175
{
142176
$this->expectException(LogicException::class);

Transport/Smtp/SmtpTransport.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class SmtpTransport extends AbstractTransport
3939
private int $pingThreshold = 100;
4040
private float $lastMessageTime = 0;
4141
private AbstractStream $stream;
42-
private string $mtaResult = '';
4342
private string $domain = '[127.0.0.1]';
4443

4544
public function __construct(?AbstractStream $stream = null, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null)
@@ -148,10 +147,6 @@ public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMess
148147
throw $e;
149148
}
150149

151-
if ($this->mtaResult && $messageId = $this->parseMessageId($this->mtaResult)) {
152-
$message->setMessageId($messageId);
153-
}
154-
155150
$this->checkRestartThreshold();
156151

157152
return $message;
@@ -235,9 +230,13 @@ protected function doSend(SentMessage $message): void
235230
$this->getLogger()->debug(sprintf('Email transport "%s" stopped', __CLASS__));
236231
throw $e;
237232
}
238-
$this->mtaResult = $this->executeCommand("\r\n.\r\n", [250]);
233+
$mtaResult = $this->executeCommand("\r\n.\r\n", [250]);
239234
$message->appendDebug($this->stream->getDebug());
240235
$this->lastMessageTime = microtime(true);
236+
237+
if ($mtaResult && $messageId = $this->parseMessageId($mtaResult)) {
238+
$message->setMessageId($messageId);
239+
}
241240
} catch (TransportExceptionInterface $e) {
242241
$e->appendDebug($this->stream->getDebug());
243242
$this->lastMessageTime = 0;

0 commit comments

Comments
 (0)