From 94aef23c4b1b61299c1709ddf49ecab2b399d444 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 15 Feb 2018 14:23:41 +0100 Subject: [PATCH 1/4] Make linkable items clickable in HTML emails Signed-off-by: Joas Schilling --- lib/MailQueueHandler.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/MailQueueHandler.php b/lib/MailQueueHandler.php index f5290fa0d..8916289f7 100644 --- a/lib/MailQueueHandler.php +++ b/lib/MailQueueHandler.php @@ -396,7 +396,7 @@ protected function sendEmailToUser($userName, $email, $lang, $timezone, $maxTime $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) { @@ -422,6 +422,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 From 551b94c63f56c3b54742be82050a273ff7710a5f Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 15 Feb 2018 14:26:37 +0100 Subject: [PATCH 2/4] Only use public methods Signed-off-by: Joas Schilling --- lib/MailQueueHandler.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/MailQueueHandler.php b/lib/MailQueueHandler.php index 8916289f7..272e74567 100644 --- a/lib/MailQueueHandler.php +++ b/lib/MailQueueHandler.php @@ -387,6 +387,7 @@ protected function sendEmailToUser($userName, $email, $lang, $timezone, $maxTime 'activityEvents' => $activityEvents, 'skippedCount' => $skippedCount, ]); + $template->setSubject($l->t('Activity notification')); $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('/')])); @@ -407,9 +408,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 { From 57791027a1004ca0b8b228784fc87120934525cd Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 21 Feb 2018 14:09:56 +0100 Subject: [PATCH 3/4] Make the URL in the email also clickable and add the name to the subject Signed-off-by: Joas Schilling --- lib/MailQueueHandler.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/MailQueueHandler.php b/lib/MailQueueHandler.php index 272e74567..1c4cab7e8 100644 --- a/lib/MailQueueHandler.php +++ b/lib/MailQueueHandler.php @@ -387,10 +387,15 @@ protected function sendEmailToUser($userName, $email, $lang, $timezone, $maxTime 'activityEvents' => $activityEvents, 'skippedCount' => $skippedCount, ]); - $template->setSubject($l->t('Activity notification')); + $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 */ From 3ca6dec7b206964f913a997c0fd5e2da688d6303 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 21 Feb 2018 15:54:28 +0100 Subject: [PATCH 4/4] Fix unit tests Signed-off-by: Joas Schilling --- tests/MailQueueHandlerTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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())