summaryrefslogtreecommitdiffstats
path: root/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php')
-rw-r--r--apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php157
1 files changed, 157 insertions, 0 deletions
diff --git a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php
new file mode 100644
index 00000000000..81d4474011c
--- /dev/null
+++ b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Thomas Citharel <tcit@tcit.fr>
+ *
+ * @author Thomas Citharel <tcit@tcit.fr>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\DAV\CalDAV\Reminder\NotificationProvider;
+
+use OCA\DAV\CalDAV\Reminder\AbstractNotificationProvider;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\IURLGenerator;
+use OCP\L10N\IFactory as L10NFactory;
+use OCP\Mail\IEMailTemplate;
+use OCP\Mail\IMailer;
+use OCP\IUser;
+use Sabre\VObject\Component\VCalendar;
+
+class EmailProvider extends AbstractNotificationProvider
+{
+ /** @var IMailer */
+ private $mailer;
+
+ public const NOTIFICATION_TYPE = 'EMAIL';
+
+ /**
+ * @param IConfig $config
+ * @param IMailer $mailer
+ * @param ILogger $logger
+ * @param L10NFactory $l10nFactory
+ * @param IUrlGenerator $urlGenerator
+ */
+ public function __construct(IConfig $config, IMailer $mailer, ILogger $logger,
+ L10NFactory $l10nFactory,
+ IURLGenerator $urlGenerator) {
+ parent::__construct($logger, $l10nFactory, $urlGenerator, $config);
+ $this->mailer = $mailer;
+ }
+
+ /**
+ * Send notification
+ *
+ * @param VCalendar $vcalendar
+ * @param string $calendarDisplayName
+ * @param IUser $user
+ * @return void
+ * @throws \Exception
+ */
+ public function send(VCalendar $vcalendar, string $calendarDisplayName, IUser $user): void
+ {
+ if ($user->getEMailAddress() === null) {
+ return;
+ }
+
+ $lang = $this->config->getUserValue($user->getUID(), 'core', 'lang', $this->l10nFactory->findLanguage());
+ $this->l10n = $this->l10nFactory->get('dav', $lang);
+
+ $event = $this->extractEventDetails($vcalendar);
+ $fromEMail = \OCP\Util::getDefaultEmailAddress('invitations-noreply');
+
+ $message = $this->mailer->createMessage()
+ ->setFrom([$fromEMail => 'Nextcloud'])
+ // TODO: Set reply to from event creator
+ // ->setReplyTo([$sender => $senderName])
+ ->setTo([$user->getEMailAddress() => $user->getDisplayName()]);
+
+ $template = $this->mailer->createEMailTemplate('dav.calendarReminder', $event);
+ $template->addHeader();
+
+ $this->addSubjectAndHeading($template, $event['title']);
+ $this->addBulletList($template, $event, $calendarDisplayName);
+
+ $template->addFooter();
+ $message->useTemplate($template);
+
+ $attachment = $this->mailer->createAttachment(
+ $vcalendar->serialize(),
+ $event['uid'].'.ics',// TODO(leon): Make file name unique, e.g. add event id
+ 'text/calendar'
+ );
+ $message->attach($attachment);
+
+ try {
+ $failed = $this->mailer->send($message);
+ if ($failed) {
+ $this->logger->error('Unable to deliver message to {failed}', ['app' => 'dav', 'failed' => implode(', ', $failed)]);
+ }
+ } catch(\Exception $ex) {
+ $this->logger->logException($ex, ['app' => 'dav']);
+ }
+ }
+
+ /**
+ * @param IEMailTemplate $template
+ * @param string $summary
+ */
+ private function addSubjectAndHeading(IEMailTemplate $template, string $summary): void
+ {
+ $template->setSubject('Notification: ' . $summary);
+ $template->addHeading($summary);
+ }
+
+ /**
+ * @param IEMailTemplate $template
+ * @param array $eventData
+ * @param string $calendarDisplayName
+ */
+ private function addBulletList(IEMailTemplate $template, array $eventData, string $calendarDisplayName): void
+ {
+ $template->addBodyListItem($calendarDisplayName, $this->l10n->t('Calendar:'),
+ $this->getAbsoluteImagePath('actions/info.svg'));
+
+ $template->addBodyListItem($eventData['when'], $this->l10n->t('Date:'),
+ $this->getAbsoluteImagePath('places/calendar.svg'));
+
+ if ($eventData['location']) {
+ $template->addBodyListItem((string) $eventData['location'], $this->l10n->t('Where:'),
+ $this->getAbsoluteImagePath('actions/address.svg'));
+ }
+ if ($eventData['description']) {
+ $template->addBodyListItem((string) $eventData['description'], $this->l10n->t('Description:'),
+ $this->getAbsoluteImagePath('actions/more.svg'));
+ }
+ if ($eventData['url']) {
+ $template->addBodyListItem((string) $eventData['url'], $this->l10n->t('Link:'),
+ $this->getAbsoluteImagePath('places/link.svg'));
+ }
+ }
+
+ /**
+ * @param string $path
+ * @return string
+ */
+ private function getAbsoluteImagePath($path): string
+ {
+ return $this->urlGenerator->getAbsoluteURL(
+ $this->urlGenerator->imagePath('core', $path)
+ );
+ }
+}