diff --git a/lib/MailQueueHandler.php b/lib/MailQueueHandler.php index f5290fa0d..1c4cab7e8 100644 --- a/lib/MailQueueHandler.php +++ b/lib/MailQueueHandler.php @@ -387,16 +387,22 @@ protected function sendEmailToUser($userName, $email, $lang, $timezone, $maxTime 'activityEvents' => $activityEvents, 'skippedCount' => $skippedCount, ]); + $template->setSubject($l->t('Activity notification for %s', $this->getSenderData('name'))); $template->addHeader(); $template->addHeading($l->t('Hello %s',[$user->getDisplayName()]), $l->t('Hello %s,',[$user->getDisplayName()])); - $template->addBodyText($l->t('There was some activity at %s', [$this->urlGenerator->getAbsoluteURL('/')])); + + $homeLink = '' . htmlspecialchars($this->getSenderData('name')) . ''; + $template->addBodyText( + $l->t('There was some activity at %s', [$homeLink]), + $l->t('There was some activity at %s', [$this->urlGenerator->getAbsoluteURL('/')]) + ); foreach ($activityEvents as $activity) { /** @var IEvent $event */ $event = $activity['event']; $relativeDateTime = $activity['relativeDateTime']; - $template->addBodyListItem($event->getParsedSubject(), $relativeDateTime, $event->getIcon()); + $template->addBodyListItem($this->getHTMLSubject($event), $relativeDateTime, $event->getIcon(), $event->getParsedSubject()); } if ($skippedCount) { @@ -407,9 +413,7 @@ protected function sendEmailToUser($userName, $email, $lang, $timezone, $maxTime $message = $this->mailer->createMessage(); $message->setTo([$email => $user->getDisplayName()]); - $message->setSubject((string) $l->t('Activity notification')); - $message->setHtmlBody($template->renderHtml()); - $message->setPlainBody($template->renderText()); + $message->useTemplate($template); $message->setFrom([$this->getSenderData('email') => $this->getSenderData('name')]); try { @@ -422,6 +426,25 @@ protected function sendEmailToUser($userName, $email, $lang, $timezone, $maxTime return true; } + /** + * @param IEvent $event + * @return string + */ + protected function getHTMLSubject(IEvent $event): string { + $placeholders = $replacements = []; + foreach ($event->getRichSubjectParameters() as $placeholder => $parameter) { + $placeholders[] = '{' . $placeholder . '}'; + + if (isset($parameter['link'])) { + $replacements[] = '' . htmlspecialchars($parameter['name']) . ''; + } else { + $replacements[] = '' . htmlspecialchars($parameter['name']) . ''; + } + } + + return str_replace($placeholders, $replacements, $event->getRichSubject()); + } + /** * @param string $lang * @param IEvent $event diff --git a/tests/MailQueueHandlerTest.php b/tests/MailQueueHandlerTest.php index 817c9fb19..a4b5f1def 100644 --- a/tests/MailQueueHandlerTest.php +++ b/tests/MailQueueHandlerTest.php @@ -118,6 +118,9 @@ protected function setUp() { $event->expects($this->any()) ->method('setSubject') ->willReturnSelf(); + $event->expects($this->any()) + ->method('getRichSubjectParameters') + ->willReturn([]); $this->activityManager = $this->createMock(IManager::class); $this->activityManager->expects($this->any()) @@ -253,11 +256,8 @@ public function testSendEmailToUser() { ->method('setTo') ->with([$email => $userDisplayName]); $this->message->expects($this->once()) - ->method('setSubject'); - $this->message->expects($this->once()) - ->method('setPlainBody'); - $this->message->expects($this->once()) - ->method('setFrom'); + ->method('useTemplate') + ->with($template); $userObject = $this->createMock(IUser::class); $userObject->expects($this->any())