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 <t.lehmann@strato.de>
This commit is contained in:
Thomas Lehmann 2024-10-29 11:53:18 +01:00 коммит произвёл Thomas Lehmann
Родитель 40211f3d07
Коммит e4c013d86d
3 изменённых файлов: 28 добавлений и 1 удалений

Просмотреть файл

@ -521,7 +521,7 @@ $CONFIG = [
'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``.
*
@ -531,6 +531,9 @@ $CONFIG = [
* 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',

Просмотреть файл

@ -27,6 +27,7 @@ use Psr\Log\LoggerInterface;
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 @@ class Mailer implements IMailer {
}
switch ($this->config->getSystemValueString('mail_smtpmode', 'smtp')) {
case 'null':
$transport = new NullTransport();
break;
case 'sendmail':
$transport = $this->getSendMailInstance();
break;

Просмотреть файл

@ -114,6 +114,26 @@ class MailerTest extends TestCase {
$this->assertEquals($sendmail, self::invokePrivate($this->mailer, 'getSendMailInstance'));
}
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')