diff --git a/composer.json b/composer.json index 033b3f19b..b47856954 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,6 @@ "symfony/monolog-bundle": "^3.5", "symfony/security-bundle": "^4.4", "symfony/serializer": "^5.3", - "symfony/swiftmailer-bundle": "^3.5", "symfony/templating": "^4.4", "symfony/translation": "^4.4", "symfony/twig-bundle": "^4.4", diff --git a/src/Bundle/ChillMainBundle/Notification/Mailer.php b/src/Bundle/ChillMainBundle/Notification/Mailer.php index c63a96f04..307d5d1df 100644 --- a/src/Bundle/ChillMainBundle/Notification/Mailer.php +++ b/src/Bundle/ChillMainBundle/Notification/Mailer.php @@ -15,7 +15,10 @@ use Chill\MainBundle\Entity\User; use Psr\Log\LoggerInterface; use Swift_Mailer; use Swift_Message; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\Email; use Symfony\Component\Routing\RouterInterface; +use Symfony\Component\Templating\EngineInterface; use Symfony\Contracts\Translation\TranslatorInterface; use Twig\Environment; @@ -26,43 +29,34 @@ use function call_user_func; * Classe d'aide pour l'envoi de notification. * * Héberge toutes les méthodes pour ré-écrire les URL en fonction de la langue de l'utilisateur. + * + * @deprecated use the MailerInterface */ class Mailer { - /** - * @var Swift_Mailer - */ - protected $forcedMailer; - /** * @var LoggerInterface */ - protected $logger; - - /** - * @var Swift_Mailer - */ - protected $mailer; + private $logger; /** * @var array */ - protected $routeParameters; + private $routeParameters; /** * @var RouterInterface */ - protected $router; + private $router; /** * @var TranslatorInterface */ - protected $translator; + private $translator; - /** - * @var \Twig\Environment - */ - protected $twig; + private EngineInterface $twig; + + private MailerInterface $mailer; /** * Mailer constructor. @@ -70,11 +64,9 @@ class Mailer * @param $routeParameters */ public function __construct( + MailerInterface $mailer, LoggerInterface $logger, - Environment $twig, - Swift_Mailer $mailer, - // due to bug https://github.com/symfony/swiftmailer-bundle/issues/127 - // \Swift_Transport $mailerTransporter, + EngineInterface $twig, RouterInterface $router, TranslatorInterface $translator, $routeParameters @@ -82,7 +74,6 @@ class Mailer $this->logger = $logger; $this->twig = $twig; $this->mailer = $mailer; - //$this->forcedMailer = new \Swift_Mailer($mailerTransporter); $this->router = $router; $this->translator = $translator; $this->routeParameters = $routeParameters; @@ -115,20 +106,6 @@ class Mailer return $content; } - /** - * @param $force - * - * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface - */ - public function sendMessage(Swift_Message $message, $force) - { - if ($force) { - $this->forcedMailer->send($message); - } else { - $this->mailer->send($message); - } - } - /** * Envoie une notification à un utilisateur. * @@ -155,23 +132,25 @@ class Mailer $subject[2] ?? null ); - $message = (new Swift_Message($subjectI18n)) - ->setFrom($fromEmail, $fromName) - ->setTo($to); + $email = new Email(); + $email->addTo($to)->subject($subjectI18n); foreach ($bodies as $contentType => $content) { - $message->setBody($content, $contentType); + match ($contentType) { + 'text/plain' => $email->text($content), + default => $email->text($content), + }; } if (null !== $callback) { - call_user_func($callback, $message); + call_user_func($callback, $email); } $this->logger->info('[notification] Sending notification', [ - 'to' => $message->getTo(), - 'subject' => $message->getSubject(), + 'to' => $email->getTo(), + 'subject' => $email->getSubject() ]); - $this->sendMessage($message, $force); + $this->mailer->send($email); } } diff --git a/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php b/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php index 07114e4b5..42881e291 100644 --- a/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php +++ b/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php @@ -14,6 +14,8 @@ namespace Chill\MainBundle\Security\PasswordRecover; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Notification\Mailer; use DateTimeInterface; +use Symfony\Bridge\Twig\Mime\TemplatedEmail; +use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use function array_merge; @@ -22,33 +24,26 @@ class RecoverPasswordHelper { public const RECOVER_PASSWORD_ROUTE = 'password_recover'; - /** - * @var Mailer - */ - protected $mailer; - - protected $routeParameters; + private MailerInterface $mailer; /** * @var TokenManager */ - protected $tokenManager; + private $tokenManager; /** * @var UrlGeneratorInterface */ - protected $urlGenerator; + private $urlGenerator; public function __construct( TokenManager $tokenManager, UrlGeneratorInterface $urlGenerator, - Mailer $mailer, - array $routeParameters + MailerInterface $mailer, ) { $this->tokenManager = $tokenManager; $this->urlGenerator = $urlGenerator; $this->mailer = $mailer; - $this->routeParameters = $routeParameters; } /** @@ -59,27 +54,14 @@ class RecoverPasswordHelper */ public function generateUrl(User $user, DateTimeInterface $expiration, $absolute = true, array $parameters = []) { - $context = $this->urlGenerator->getContext(); - $previousHost = $context->getHost(); - $previousScheme = $context->getScheme(); - - $context->setHost($this->routeParameters['host']); - $context->setScheme($this->routeParameters['scheme']); - - $url = $this->urlGenerator->generate( + return $this->urlGenerator->generate( self::RECOVER_PASSWORD_ROUTE, array_merge( $this->tokenManager->generate($user, $expiration), $parameters ), - $absolute ? UrlGeneratorInterface::ABSOLUTE_URL : UrlGeneratorInterface::ABSOLUTE_PATH + UrlGeneratorInterface::ABSOLUTE_URL ); - - // reset the host - $context->setHost($previousHost); - $context->setScheme($previousScheme); - - return $url; } public function sendRecoverEmail( @@ -91,26 +73,20 @@ class RecoverPasswordHelper array $additionalUrlParameters = [], $emailSubject = 'Recover your password' ) { - $content = $this->mailer->renderContentToUser( - $user, - $template, - array_merge( - [ - 'user' => $user, - 'url' => $this->generateUrl($user, $expiration, true, $additionalUrlParameters), - ], - $templateParameters - ) - ); + if (null === $user->getEmail() || '' === trim($user->getEmail())) { + throw new \UnexpectedValueException("No emaail associated to the user"); + } - $this->mailer->sendNotification( - $user, - [$emailSubject], - [ - 'text/plain' => $content, - ], - null, - $force - ); + $email = (new TemplatedEmail()) + ->subject($emailSubject) + ->to($user->getEmail()) + ->textTemplate($template) + ->context([ + 'user' => $user, + 'url' => $this->generateUrl($user, $expiration, true, $additionalUrlParameters), + ...$templateParameters + ]); + + $this->mailer->send($email); } } diff --git a/src/Bundle/ChillMainBundle/config/services/notification.yaml b/src/Bundle/ChillMainBundle/config/services/notification.yaml index bb0b6bb8c..29cbce946 100644 --- a/src/Bundle/ChillMainBundle/config/services/notification.yaml +++ b/src/Bundle/ChillMainBundle/config/services/notification.yaml @@ -10,12 +10,6 @@ services: Chill\MainBundle\Notification\Mailer: arguments: - $logger: '@Psr\Log\LoggerInterface' - $twig: '@Twig\Environment' - $mailer: '@swiftmailer.mailer.default' - # $mailerTransporter: '@swiftmailer.transport' - $router: '@Symfony\Component\Routing\RouterInterface' - $translator: '@Symfony\Contracts\Translation\TranslatorInterface' $routeParameters: '%chill_main.notifications%' Chill\MainBundle\Notification\NotificationHandlerManager: diff --git a/src/Bundle/ChillMainBundle/config/services/security.yaml b/src/Bundle/ChillMainBundle/config/services/security.yaml index c0d9f98b9..38089becf 100644 --- a/src/Bundle/ChillMainBundle/config/services/security.yaml +++ b/src/Bundle/ChillMainBundle/config/services/security.yaml @@ -61,11 +61,7 @@ services: arguments: $secret: '%kernel.secret%' - Chill\MainBundle\Security\PasswordRecover\RecoverPasswordHelper: - arguments: - $tokenManager: '@Chill\MainBundle\Security\PasswordRecover\TokenManager' - $mailer: '@Chill\MainBundle\Notification\Mailer' - $routeParameters: "%chill_main.notifications%" + Chill\MainBundle\Security\PasswordRecover\RecoverPasswordHelper: ~ Chill\MainBundle\Security\PasswordRecover\PasswordRecoverEventSubscriber: arguments: