diff options
Diffstat (limited to 'lib/private/Mail/Mailer.php')
-rw-r--r-- | lib/private/Mail/Mailer.php | 105 |
1 files changed, 60 insertions, 45 deletions
diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php index 61dc6f9214b..bdc4d6760e0 100644 --- a/lib/private/Mail/Mailer.php +++ b/lib/private/Mail/Mailer.php @@ -1,41 +1,15 @@ <?php declare(strict_types=1); - /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arne Hamann <kontakt+github@arne.email> - * @author Branko Kokanovic <branko@kokanovic.org> - * @author Carsten Wiedmann <carsten_sttgt@gmx.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Jared Boone <jared.boone@gmail.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Julius Härtl <jus@bitgrid.net> - * @author kevin147147 <kevintamool@gmail.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Tekhnee <info@tekhnee.org> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OC\Mail; use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\NoRFCWarningsValidation; use Egulias\EmailValidator\Validation\RFCValidation; use OCP\Defaults; use OCP\EventDispatcher\IEventDispatcher; @@ -53,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; @@ -65,7 +40,7 @@ use Symfony\Component\Mime\Exception\RfcComplianceException; * * Example usage: * - * $mailer = \OC::$server->getMailer(); + * $mailer = \OC::$server->get(\OCP\Mail\IMailer::class); * $message = $mailer->createMessage(); * $message->setSubject('Your Subject'); * $message->setFrom(array('cloud@domain.org' => 'ownCloud Notifier')); @@ -78,16 +53,22 @@ use Symfony\Component\Mime\Exception\RfcComplianceException; * @package OC\Mail */ class Mailer implements IMailer { + // Do not move this block or change it's content without contacting the release crew + public const DEFAULT_DIMENSIONS = '252x120'; + // Do not move this block or change it's content without contacting the release crew + + public const MAX_LOGO_SIZE = 105; + private ?MailerInterface $instance = null; public function __construct( - private IConfig $config, - private LoggerInterface $logger, - private Defaults $defaults, - private IURLGenerator $urlGenerator, - private IL10N $l10n, + private IConfig $config, + private LoggerInterface $logger, + private Defaults $defaults, + private IURLGenerator $urlGenerator, + private IL10N $l10n, private IEventDispatcher $dispatcher, - private IFactory $l10nFactory, + private IFactory $l10nFactory, ) { } @@ -123,6 +104,31 @@ class Mailer implements IMailer { * @since 12.0.0 */ public function createEMailTemplate(string $emailId, array $data = []): IEMailTemplate { + $logoDimensions = $this->config->getAppValue('theming', 'logoDimensions', self::DEFAULT_DIMENSIONS); + if (str_contains($logoDimensions, 'x')) { + [$width, $height] = explode('x', $logoDimensions); + $width = (int)$width; + $height = (int)$height; + + if ($width > self::MAX_LOGO_SIZE || $height > self::MAX_LOGO_SIZE) { + if ($width === $height) { + $logoWidth = self::MAX_LOGO_SIZE; + $logoHeight = self::MAX_LOGO_SIZE; + } elseif ($width > $height) { + $logoWidth = self::MAX_LOGO_SIZE; + $logoHeight = (int)(($height / $width) * self::MAX_LOGO_SIZE); + } else { + $logoWidth = (int)(($width / $height) * self::MAX_LOGO_SIZE); + $logoHeight = self::MAX_LOGO_SIZE; + } + } else { + $logoWidth = $width; + $logoHeight = $height; + } + } else { + $logoWidth = $logoHeight = null; + } + $class = $this->config->getSystemValueString('mail_template_class', ''); if ($class !== '' && class_exists($class) && is_a($class, EMailTemplate::class, true)) { @@ -130,6 +136,8 @@ class Mailer implements IMailer { $this->defaults, $this->urlGenerator, $this->l10nFactory, + $logoWidth, + $logoHeight, $emailId, $data ); @@ -139,6 +147,8 @@ class Mailer implements IMailer { $this->defaults, $this->urlGenerator, $this->l10nFactory, + $logoWidth, + $logoHeight, $emailId, $data ); @@ -222,9 +232,6 @@ class Mailer implements IMailer { } /** - * @deprecated 26.0.0 Implicit validation is done in \OC\Mail\Message::setRecipients - * via \Symfony\Component\Mime\Address::__construct - * * @param string $email Email address to be validated * @return bool True if the mail address is valid, false otherwise */ @@ -233,8 +240,10 @@ class Mailer implements IMailer { // Shortcut: empty addresses are never valid return false; } + + $strictMailCheck = $this->config->getAppValue('core', 'enforce_strict_email_check', 'yes') === 'yes'; $validator = new EmailValidator(); - $validation = new RFCValidation(); + $validation = $strictMailCheck ? new NoRFCWarningsValidation() : new RFCValidation(); return $validator->isValid($email, $validation); } @@ -244,9 +253,10 @@ class Mailer implements IMailer { return $this->instance; } - $transport = null; - switch ($this->config->getSystemValueString('mail_smtpmode', 'smtp')) { + case 'null': + $transport = new NullTransport(); + break; case 'sendmail': $transport = $this->getSendMailInstance(); break; @@ -256,7 +266,9 @@ class Mailer implements IMailer { break; } - return new SymfonyMailer($transport); + $this->instance = new SymfonyMailer($transport); + + return $this->instance; } /** @@ -323,8 +335,10 @@ class Mailer implements IMailer { break; default: $sendmail = \OCP\Server::get(IBinaryFinder::class)->findBinaryPath('sendmail'); - if ($sendmail === null) { + if ($sendmail === false) { + // fallback (though not sure what good it'll do) $sendmail = '/usr/sbin/sendmail'; + $this->logger->debug('sendmail binary search failed, using fallback ' . $sendmail, ['app' => 'core']); } $binaryPath = $sendmail; break; @@ -335,6 +349,7 @@ class Mailer implements IMailer { default => ' -bs', }; + $this->logger->debug('Using sendmail binary: ' . $binaryPath, ['app' => 'core']); return new SendmailTransport($binaryPath . $binaryParam, null, $this->logger); } } |