From 4be991899f4b0f988ff4611b8056fa88b2a122b5 Mon Sep 17 00:00:00 2001 From: Thomas Lehmann Date: Tue, 29 Oct 2024 11:53:18 +0100 Subject: [PATCH] feat(Mailer): add "null" SMTP transport mode == Goal Allow disabling mail delivery altogether. == Usecase If mails ought to be send by other means than rendering messages from templates and sending them via SMTP-like protocols. Example: listening to specific Nextcloud events and pass parameters to a centralized (i.e. REST-based) API that sends e-mails. Signed-off-by: Thomas Lehmann --- config/config.sample.php | 5 ++++- lib/private/Mail/Mailer.php | 4 ++++ tests/lib/Mail/MailerTest.php | 23 ++++++++++++++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/config/config.sample.php b/config/config.sample.php index b39675909f69c..c8e29ca95e9d2 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -501,7 +501,7 @@ 'mail_smtpdebug' => false, /** - * Which mode to use for sending mail: ``sendmail``, ``smtp`` or ``qmail``. + * Which mode to use for sending mail: ``sendmail``, ``smtp``, ``qmail`` or ``null``. * * If you are using local or remote SMTP, set this to ``smtp``. * @@ -511,6 +511,9 @@ * For ``qmail`` the binary is /var/qmail/bin/sendmail, and it must be installed * on your Unix system. * + * Use the string ``null`` to send no mails (disable mail delivery). This can be + * useful if mails should be sent via APIs and rendering messages is not necessary. + * * Defaults to ``smtp`` */ 'mail_smtpmode' => 'smtp', diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php index 0a5b633c52ed1..ce219d59010e6 100644 --- a/lib/private/Mail/Mailer.php +++ b/lib/private/Mail/Mailer.php @@ -27,6 +27,7 @@ use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\Mailer as SymfonyMailer; use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mailer\Transport\NullTransport; use Symfony\Component\Mailer\Transport\SendmailTransport; use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport; use Symfony\Component\Mailer\Transport\Smtp\Stream\SocketStream; @@ -256,6 +257,9 @@ protected function getInstance(): MailerInterface { } switch ($this->config->getSystemValueString('mail_smtpmode', 'smtp')) { + case 'null': + $transport = new NullTransport(); + break; case 'sendmail': $transport = $this->getSendMailInstance(); break; diff --git a/tests/lib/Mail/MailerTest.php b/tests/lib/Mail/MailerTest.php index 2afd78eb6ff8f..d3f6adcbc971c 100644 --- a/tests/lib/Mail/MailerTest.php +++ b/tests/lib/Mail/MailerTest.php @@ -20,6 +20,7 @@ use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Symfony\Component\Mailer\Mailer as SymfonyMailer; +use Symfony\Component\Mailer\Transport\NullTransport; use Symfony\Component\Mailer\Transport\SendmailTransport; use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport; use Symfony\Component\Mime\Email; @@ -113,7 +114,27 @@ public function testGetSendmailInstanceSendMailQmail($sendmailMode, $binaryParam $this->assertEquals($sendmail, self::invokePrivate($this->mailer, 'getSendMailInstance')); } - public function testGetInstanceDefault() { + public function testEventForNullTransport(): void { + $this->config + ->expects($this->exactly(1)) + ->method('getSystemValueString') + ->with('mail_smtpmode', 'smtp') + ->willReturn('null'); + + $message = $this->createMock(Message::class); + $message->expects($this->once()) + ->method('getSymfonyEmail') + ->willReturn((new Email())->to("foo@bar.com")->from("bar@foo.com")->text("")); + + $event = new BeforeMessageSent($message); + $this->dispatcher->expects($this->once()) + ->method('dispatchTyped') + ->with($this->equalTo($event)); + + $this->mailer->send($message); + } + + public function testGetInstanceDefault(): void { $this->config ->method('getSystemValue') ->willReturnMap([