Newer
Older
<?php
namespace SGalinski\SgMail\Service;

Torsten Oppermann
committed
/***************************************************************
* Copyright notice
*
* (c) sgalinski Internet Services (https://www.sgalinski.de)
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script 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 General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use SGalinski\SgMail\Domain\Model\Mail;
use SGalinski\SgMail\Domain\Model\Template;
use SGalinski\SgMail\Domain\Repository\MailRepository;
use SGalinski\SgMail\Domain\Repository\TemplateRepository;
use Swift_Attachment;
use Swift_OutputByteStream;
use TYPO3\CMS\Core\Mail\MailMessage;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
use TYPO3\CMS\Fluid\View\StandaloneView;
/**
* MailTemplateService
*/
class MailTemplateService {
/**
* @var string
*/
const MARKER_TYPE_STRING = 'String';
/**
* @var string
*/
const MARKER_TYPE_DATE = 'Date';
/**
* @var string
*/
const MARKER_TYPE_INTEGER = 'Integer';

Torsten Oppermann
committed
private static $registerArray = [];
private $language;
* @var boolean $ignoreMailQueue
/**
* @var \TYPO3\CMS\Core\Mail\MailMessage $mailMessage
*/
private $mailMessage;
/**
*/
private $templateName;
/**
*/
private $extensionKey;
/**

Torsten Oppermann
committed
private $markers = [];
/**
* holds the TypoScript configuration for sg_mail
*
*/
private $tsSettings = [];
/**
* @var array $bccAddresses
*/
private $bccAddresses = [];
/**
* @var int
*/
private $priority = Mail::PRIORITY_LOWEST;

Torsten Oppermann
committed
/**
* @var \SGalinski\SgMail\Domain\Repository\TemplateRepository
*/
protected $templateRepository;
/**
* @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
*/
protected $persistenceManager;

Torsten Oppermann
committed

Markus Guenther
committed
/**
* @var \TYPO3\CMS\Extbase\Object\ObjectManager
*/
protected $objectManager;
/**
* @var array
*/
private $attachments = [];
/**
* MailTemplateService constructor.
*/
public function __construct() {

Markus Guenther
committed
/** @var ObjectManager objectManager */
$this->objectManager = GeneralUtility::makeInstance(ObjectManager::class);
/** @var MailMessage mailMessage */
$this->mailMessage = $this->objectManager->get(MailMessage::class);
/** @var TypoScriptSettingsService $typoScriptSettingsService */
$typoScriptSettingsService = $this->objectManager->get(TypoScriptSettingsService::class);
$this->tsSettings = $typoScriptSettingsService->getSettings(0, 'tx_sgmail');
$this->language = $this->tsSettings['templateDefaultLanguage'];

Markus Guenther
committed
/** @var TemplateRepository templateRepository */
$this->templateRepository = $this->objectManager->get(TemplateRepository::class);
/** @var PersistenceManager persistenceManager */
$this->persistenceManager = $this->objectManager->get(PersistenceManager::class);
$this->fromAddress = $this->tsSettings['mail']['default']['from'];
$this->mailMessage->setFrom($this->fromAddress);
$this->bccAddresses = GeneralUtility::trimExplode(',', $this->tsSettings['mail']['default']['bcc']);

Torsten Oppermann
committed
$this->ccAddresses = GeneralUtility::trimExplode(',', $this->tsSettings['mail']['default']['cc']);
foreach ($this->bccAddresses as $index => $email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
unset($this->bccAddresses[$index]);
}
}
foreach ($this->ccAddresses as $index => $email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
unset($this->ccAddresses[$index]);
}
}
if (count($this->bccAddresses) > 0) {

Torsten Oppermann
committed
$this->mailMessage->setBcc($this->bccAddresses);
}
if (count($this->ccAddresses) > 0) {

Torsten Oppermann
committed
$this->mailMessage->setCc($this->ccAddresses);
}

Torsten Oppermann
committed
* description and subject can now be an array i.e. with elements such as 'en' => 'english description'
* or an translation string used in locallang.xml
*
* @param string $extension
* @param string $templateName
* @param string $templatePath

Torsten Oppermann
committed
* @param mixed $description

Torsten Oppermann
committed
* @param array $markers

Torsten Oppermann
committed
* @param mixed $subject
public static function registerTemplate(

Torsten Oppermann
committed
$extension, $templateName, $templatePath, $description, array $markers, $subject
MailTemplateService::$registerArray[$extension][$templateName] = [
'templatePath' => $templatePath,

Torsten Oppermann
committed
'description' => $description,

Torsten Oppermann
committed
'marker' => $markers,

Torsten Oppermann
committed
'extension' => $extension,

Torsten Oppermann
committed
'subject' => $subject

Torsten Oppermann
committed
];
}
/**
* Return default markers for sg_mail
*
* @param string $translationKey
* @param array $marker
* @param string $extensionKey
* @return array
*/
public static function getDefaultTemplateMarker($translationKey, array $marker, $extensionKey = 'sg_mail') {
$languagePath = 'LLL:EXT:' . $extensionKey . '/Resources/Private/Language/locallang.xlf:' . $translationKey;
// Need the key for translations
if (trim($extensionKey) === '') {
return [];
}
$generatedMarker = [];
foreach ($marker as $markerName) {
$generatedMarker[] = [
'marker' => $markerName,
'value' => $languagePath . '.example.' . $markerName,
'description' => $languagePath . '.description.' . $markerName,
'backend_translation_key' => $translationKey . '.example.' . $markerName,
'extension_key' => $extensionKey
];
}
return $generatedMarker;
}

Torsten Oppermann
committed
* @return array

Torsten Oppermann
committed
public static function getRegisterArray() {
return self::$registerArray;

Torsten Oppermann
committed
* Send the Email

Torsten Oppermann
committed
*

Torsten Oppermann
committed
* @return boolean email was sent or added to mail queue successfully?
public function sendEmail($isPreview = FALSE) {

Torsten Oppermann
committed
/** @var Template $template */
$template = $this->templateRepository->findOneByTemplate(

Torsten Oppermann
committed
$this->extensionKey, $this->templateName, $this->language

Torsten Oppermann
committed
// If there is no template for this language, use the default template
if ($template === NULL) {
$templatePath = self::$registerArray[$this->extensionKey][$this->templateName]['templatePath'];
$templateFile = $templatePath . $this->language . '.template.html';
if (file_exists($templateFile)) {
$defaultTemplateContent = file_get_contents($templatePath . $this->language . '.template.html');
} else {
// no language found and no default template

Torsten Oppermann
committed
// does an english default template exist ?
if (file_exists($templatePath . $this->language . '.template.html')) {
$this->sendEmail();
return TRUE;
}
return FALSE;
if ($isPreview) {
$previewMarker = [];
$markerArray = self::$registerArray[$this->extensionKey][$this->templateName]['marker'];
foreach ($markerArray as $marker) {
if ($marker['backend_translation_key']) {
$previewMarker[$marker['marker']] = LocalizationUtility::translate(
$marker['backend_translation_key'], $marker['extension_key']
);
} else {
$previewMarker[$marker['marker']] = $marker['value'];
}
$this->setMarkers($previewMarker);
}
/** @var StandaloneView $emailView */

Markus Guenther
committed
$emailView = $this->objectManager->get(StandaloneView::class);
if (!isset($defaultTemplateContent)) {
$emailView->setTemplateSource($template->getContent());
$subject = $template->getSubject();
} else {
$emailView->setTemplateSource($defaultTemplateContent);

Torsten Oppermann
committed
$subject = self::$registerArray[$this->extensionKey][$this->templateName]['subject'];
if (is_array($subject)) {
$subject = self::$registerArray[$this->extensionKey][$this->templateName]['subject'][$this->language];
} else {
$subject = LocalizationUtility::translate(
self::$registerArray[$this->extensionKey][$this->templateName]['subject'],
$this->extensionKey
);
}

Torsten Oppermann
committed
}
$this->mailMessage->setSubject($subject);

Torsten Oppermann
committed

Torsten Oppermann
committed
$emailView->assignMultiple($this->markers);
$emailBody = $emailView->render();
// insert <br /> tags, but replace every instance of three or more successive breaks with just two.
$emailBody = nl2br($emailBody);
$emailBody = preg_replace('/(<br[\s]?[\/]?>[\s]*){3,}/', '<br /><br />', $emailBody);
$this->addMailToMailQueue($subject, $emailBody, $this->priority, TRUE);

Torsten Oppermann
committed
$this->mailMessage->setBody($emailBody, 'text/html');
$this->addMailToMailQueue($subject, $emailBody, $this->priority);

Torsten Oppermann
committed
return TRUE;
}
/**
* Adds a new mail to the mail queue.
private function addMailToMailQueue($subject, $emailBody, $priority, $sent = FALSE) {

Markus Guenther
committed
$mail = $this->objectManager->get(Mail::class);
$mail->setFromAddress($this->fromAddress);
$mail->setToAddress($this->toAddresses);
$mail->setMailSubject($subject);
$mail->setPriority($priority);
$mail->setBccAddresses(implode(',', $this->bccAddresses));
$mail->setCcAddresses(implode(',', $this->ccAddresses));
$mail->setSent($sent);

Markus Guenther
committed
$mailRepository = $this->objectManager->get(MailRepository::class);
$mailRepository->add($mail);
$this->persistenceManager->persistAll();
/**
* @param array $registerArray
public static function setRegisterArray(array $registerArray) {
self::$registerArray = $registerArray;
}
/**
* @param string $toAddresses
* @return MailTemplateService
*/
public function setToAddresses($toAddresses) {
$this->toAddresses = $toAddresses;
$this->mailMessage->setTo($toAddresses);
* @param string $fromAddress
* @return MailTemplateService
*/
public function setFromAddress($fromAddress) {
$this->fromAddress = $fromAddress;
$this->mailMessage->setFrom($fromAddress);
* @return MailTemplateService
*/
public function setCcAddresses($ccAddresses) {
$this->ccAddresses[] = $ccAddresses;
$this->mailMessage->setCc($this->ccAddresses);
* @param string $replyToAddress
* @return MailTemplateService
*/
public function setReplyToAddress($replyToAddress) {
$this->replyToAddress = $replyToAddress;
$this->mailMessage->setReplyTo($replyToAddress);
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
return $this;
}
/**
* @param string $language
* @return MailTemplateService
*/
public function setLanguage($language) {
$this->language = $language;
return $this;
}
/**
* @param boolean $ignoreMailQueue
* @return MailTemplateService
*/
public function setIgnoreMailQueue($ignoreMailQueue) {
$this->ignoreMailQueue = $ignoreMailQueue;
return $this;
}
/**
* @param string $templateName
* @return MailTemplateService
*/
public function setTemplateName($templateName) {
$this->templateName = $templateName;
return $this;
}
/**
* @param string $extensionKey
* @return MailTemplateService
*/
public function setExtensionKey($extensionKey) {
$this->extensionKey = $extensionKey;
return $this;
}

Torsten Oppermann
committed
* @param array $markers
* @return MailTemplateService
*/

Torsten Oppermann
committed
public function setMarkers(array $markers) {
$this->markers = $markers;
return $this;
}
/**
* @param array $bccAddresses
* @return MailTemplateService
*/
public function setBccAddresses(array $bccAddresses) {
$this->bccAddresses[] = $bccAddresses;
$this->mailMessage->setBcc($this->bccAddresses);
/**
* @param int $priority
* @return MailTemplateService
*/
public function setPriority($priority) {
$this->priority = $priority;
return $this;
}
/**
* @param Swift_OutputByteStream $data
* @param string $path
* @param string $contentType
* @return MailTemplateService
*/
public function addAttachment($data, $filename, $contentType) {
$attachment = Swift_Attachment::newInstance()
->setFilename($filename)
->setContentType($contentType)
->setBody($data);
$this->mailMessage->attach($attachment);
return $this;
}
/**
* @return MailMessage
*/
public function getMailMessage() {
return $this->mailMessage;
}