From 849211a780b95ad05284d9cf11906d3dfba47b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Deruss=C3=A9?= Date: Mon, 21 Dec 2020 18:33:12 +0100 Subject: [PATCH] Handle failure when sending DATA --- .../Transport/Smtp/SmtpTransportTest.php | 31 +++++++++++++++++++ .../Mailer/Transport/Smtp/SmtpTransport.php | 17 +++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Mailer/Tests/Transport/Smtp/SmtpTransportTest.php b/src/Symfony/Component/Mailer/Tests/Transport/Smtp/SmtpTransportTest.php index 38229ce844ec8..91b1685077337 100644 --- a/src/Symfony/Component/Mailer/Tests/Transport/Smtp/SmtpTransportTest.php +++ b/src/Symfony/Component/Mailer/Tests/Transport/Smtp/SmtpTransportTest.php @@ -18,6 +18,8 @@ use Symfony\Component\Mailer\Transport\Smtp\Stream\AbstractStream; use Symfony\Component\Mailer\Transport\Smtp\Stream\SocketStream; use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Email; +use Symfony\Component\Mime\Exception\InvalidArgumentException; use Symfony\Component\Mime\RawMessage; class SmtpTransportTest extends TestCase @@ -86,6 +88,29 @@ public function testSendDoesPingAboveThreshold() $transport->send(new RawMessage('Message 3'), $envelope); $this->assertContains("NOOP\r\n", $stream->getCommands()); } + + public function testSendInvalidMessage() + { + $stream = new DummyStream(); + + $transport = new SmtpTransport($stream); + $transport->setPingThreshold(1); + + $message = new Email(); + $message->to('recipient@example.org'); + $message->from('sender@example.org'); + $message->attachFromPath('/does_not_exists'); + + try { + $transport->send($message); + $this->fail('Expected Symfony\Component\Mime\Exception\InvalidArgumentException to be thrown'); + } catch (InvalidArgumentException $e) { + $this->assertMatchesRegularExpression('{Path "/does_not_exists"}i', $e->getMessage()); + } + + $this->assertNotContains("\r\n.\r\n", $stream->getCommands()); + $this->assertTrue($stream->isClosed()); + } } class DummyStream extends AbstractStream @@ -164,4 +189,10 @@ public function isClosed(): bool { return $this->closed; } + + public function terminate(): void + { + parent::terminate(); + $this->closed = true; + } } diff --git a/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php b/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php index 5ef8a8825509f..9e5ead35a3f4b 100644 --- a/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php +++ b/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php @@ -159,7 +159,7 @@ public function __toString(): string return $name; } - return sprintf('smtp://sendmail'); + return 'smtp://sendmail'; } /** @@ -200,10 +200,19 @@ protected function doSend(SentMessage $message): void } $this->executeCommand("DATA\r\n", [354]); - foreach (AbstractStream::replace("\r\n.", "\r\n..", $message->toIterable()) as $chunk) { - $this->stream->write($chunk, false); + try { + foreach (AbstractStream::replace("\r\n.", "\r\n..", $message->toIterable()) as $chunk) { + $this->stream->write($chunk, false); + } + $this->stream->flush(); + } catch (TransportExceptionInterface $e) { + throw $e; + } catch (\Exception $e) { + $this->stream->terminate(); + $this->started = false; + $this->getLogger()->debug(sprintf('Email transport "%s" stopped', __CLASS__)); + throw $e; } - $this->stream->flush(); $this->executeCommand("\r\n.\r\n", [250]); $message->appendDebug($this->stream->getDebug()); $this->lastMessageTime = microtime(true); 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