From 9b3c3450b89ff29e6bfcec8946f62fffe3004b5d Mon Sep 17 00:00:00 2001 From: carlobeltrame Date: Mon, 10 Nov 2025 20:47:33 +0100 Subject: [PATCH] Set reply-to on camp invitation mails --- api/src/Service/MailService.php | 9 ++++++++- api/tests/Service/MailServiceTest.php | 14 +++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/api/src/Service/MailService.php b/api/src/Service/MailService.php index e35376d205..35e14e259b 100644 --- a/api/src/Service/MailService.php +++ b/api/src/Service/MailService.php @@ -7,6 +7,7 @@ use App\Entity\Profile; use App\Entity\User; use Symfony\Bridge\Twig\Mime\TemplatedEmail; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Address; @@ -22,13 +23,19 @@ public function __construct( private readonly Environment $twigEnironment, private readonly string $frontendBaseUrl, private readonly string $senderEmail, - private readonly string $senderName = '' + private readonly string $senderName, + private readonly Security $security, ) {} public function sendInviteToCampMail(User $byUser, Camp $camp, string $key, string $emailToInvite): void { + /** @var User $originator */ + $originator = $this->security->getUser(); + $originatorEmail = $originator->getEmail(); + $originatorName = $originator->getDisplayName(); $email = new TemplatedEmail() ->from(new Address($this->senderEmail, $this->senderName)) ->to(new Address($emailToInvite)) + ->replyTo(new Address($originatorEmail, $originatorName)) ->subject($this->translator->trans('inviteToCamp.subject', ['campTitle' => $camp->title], self::TRANSLATE_DOMAIN, $byUser->profile->language)) ->htmlTemplate($this->getTemplate('emails/campCollaborationInvite.{language}.html.twig', $byUser)) ->textTemplate($this->getTemplate('emails/campCollaborationInvite.{language}.text.twig', $byUser)) diff --git a/api/tests/Service/MailServiceTest.php b/api/tests/Service/MailServiceTest.php index 714dcb69cc..b1f48b26f2 100644 --- a/api/tests/Service/MailServiceTest.php +++ b/api/tests/Service/MailServiceTest.php @@ -10,6 +10,7 @@ use App\Service\MailService; use PHPUnit\Framework\Attributes\DataProvider; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Mailer\MailerInterface; use Symfony\Contracts\Translation\TranslatorInterface; use Twig\Environment; @@ -23,6 +24,7 @@ class MailServiceTest extends KernelTestCase { private Camp $camp; private User $user; + private Security $security; private MailService $mailer; @@ -33,7 +35,15 @@ protected function setUp(): void { $translator = self::getContainer()->get(TranslatorInterface::class); $twigEnvironment = self::getContainer()->get(Environment::class); - $this->mailer = new MailService($mailer, $translator, $twigEnvironment, 'frontend.example.com', 'sender@example.com', 'SenderName'); + $this->security = $this->createMock(Security::class); + $profile = new Profile(); + $profile->nickname = 'Linux'; + $profile->email = 'sender@ecamp3.ch'; + $user = new User(); + $user->profile = $profile; + $this->security->method('getUser')->willReturn($user); + + $this->mailer = new MailService($mailer, $translator, $twigEnvironment, 'frontend.example.com', 'sender@example.com', 'SenderName', $this->security); $this->user = new User(); $profile = new Profile(); @@ -52,6 +62,7 @@ public function testSendInviteToCampMailDeChScout() { self::assertEmailCount(1); $mailerMessage = self::getMailerMessage(0); self::assertEmailAddressContains($mailerMessage, 'To', self::INVITE_MAIL); + self::assertEmailAddressContains($mailerMessage, 'reply-to', 'sender@ecamp3.ch'); self::assertEmailHeaderSame($mailerMessage, 'subject', '[eCamp v3] Du wurdest ins Lager "some camp title" eingeladen'); self::assertEmailHtmlBodyContains($mailerMessage, $this->camp->title); @@ -71,6 +82,7 @@ public function testSendInvitationMailDoesNotCrashForAllLanguages(string $langua self::assertEmailCount(1); $mailerMessage = self::getMailerMessage(0); self::assertEmailAddressContains($mailerMessage, 'To', self::INVITE_MAIL); + self::assertEmailAddressContains($mailerMessage, 'reply-to', 'sender@ecamp3.ch'); self::assertEmailHtmlBodyContains($mailerMessage, $this->camp->title); self::assertEmailHtmlBodyContains($mailerMessage, $this->user->getDisplayName());