MailTemplateService.php 22.1 KB
Newer Older
1
2
3
4
<?php

namespace SGalinski\SgMail\Service;

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/***************************************************************
 *  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!
 ***************************************************************/
28

29
use DateTime;
30
31
32
use SGalinski\SgMail\Domain\Model\Mail;
use SGalinski\SgMail\Domain\Model\Template;
use SGalinski\SgMail\Domain\Repository\MailRepository;
33
use SGalinski\SgMail\Domain\Repository\TemplateRepository;
34
35
use Swift_Attachment;
use Swift_OutputByteStream;
36
use TYPO3\CMS\Core\Mail\MailMessage;
37
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
38
39
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
40
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
41
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
42
use TYPO3\CMS\Fluid\View\StandaloneView;
43
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
44

45
46
47
/**
 * MailTemplateService
 */
48
class MailTemplateService {
49
	const MARKER_TYPE_STRING = 'String';
50
51
	const MARKER_TYPE_ARRAY = 'Array';
	const MARKER_TYPE_OBJECT = 'Object';
52
	const DEFAULT_LANGUAGE = 'default';
53
	const DEFAULT_TEMPLATE_PATH = 'Resources/Private/Templates/SgMail/';
54

55
	/**
56
	 * @var array $registerArray
57
	 */
58
	private static $registerArray = [];
59

60
	/**
61
	 * @var array $toAddresses
62
	 */
63
	private $toAddresses = [];
64
65

	/**
66
	 * @var string $fromAddress
67
	 */
68
	private $fromAddress;
69
70

	/**
71
	 * @var array $ccAddresses
72
	 */
Paul Ilea's avatar
Paul Ilea committed
73
	private $ccAddresses;
74
75

	/**
76
	 * @var string $replyToAddress
77
	 */
78
	private $replyToAddress;
79
80

	/**
81
	 * @var string $language
82
	 */
83
	private $language = 'default';
84
85

	/**
86
	 * @var boolean $ignoreMailQueue
87
	 */
88
	private $ignoreMailQueue = FALSE;
89
90
91
92
93
94
95

	/**
	 * @var \TYPO3\CMS\Core\Mail\MailMessage $mailMessage
	 */
	private $mailMessage;

	/**
96
	 * @var string $templateName
97
98
99
100
	 */
	private $templateName;

	/**
101
	 * @var string $extensionKey
102
103
104
105
	 */
	private $extensionKey;

	/**
106
	 * @var array $markers
107
	 */
Torsten Oppermann's avatar
Torsten Oppermann committed
108
	private $markers;
109

110
111
112
	/**
	 * @var array $bccAddresses
	 */
Paul Ilea's avatar
Paul Ilea committed
113
	private $bccAddresses;
114

115
116
117
118
119
	/**
	 * @var int
	 */
	private $priority = Mail::PRIORITY_LOWEST;

120
121
122
123
124
	/**
	 * @var int
	 */
	private $pid;

125
126
127
128
129
	/**
	 * @var string
	 */
	private $fromName = '';

130
131
132
	/**
	 * @var \SGalinski\SgMail\Domain\Repository\TemplateRepository
	 */
133
134
135
136
137
138
	protected $templateRepository;

	/**
	 * @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
	 */
	protected $persistenceManager;
139

140
141
142
143
144
	/**
	 * @var \TYPO3\CMS\Extbase\Object\ObjectManager
	 */
	protected $objectManager;

145
146
	/**
	 * MailTemplateService constructor.
Paul Ilea's avatar
Paul Ilea committed
147
	 *
148
149
150
	 * @param string $templateName
	 * @param string $extensionKey
	 * @param string $markers
Paul Ilea's avatar
Paul Ilea committed
151
	 * @throws \InvalidArgumentException
152
	 */
153
154
155
156
157
	public function __construct($templateName = '', $extensionKey = '', $markers = '') {
		$this->templateName = $templateName;
		$this->extensionKey = $extensionKey;
		$this->markers = $markers;

158
159
160
161
162
163
		/** @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);
Torsten Oppermann's avatar
Torsten Oppermann committed
164
		$tsSettings = $typoScriptSettingsService->getSettings(0, 'tx_sgmail');
165
166
167
168
		/** @var TemplateRepository templateRepository */
		$this->templateRepository = $this->objectManager->get(TemplateRepository::class);
		/** @var PersistenceManager persistenceManager */
		$this->persistenceManager = $this->objectManager->get(PersistenceManager::class);
169

170
		// use defaultMailFromAddress if it is provided in LocalConfiguration.php; use the sg_mail TS setting as fallback
171
		if (!filter_var($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'], FILTER_VALIDATE_EMAIL)) {
172
173
			$this->fromAddress = $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'];
		} else {
Torsten Oppermann's avatar
Torsten Oppermann committed
174
			$this->fromAddress = $tsSettings['mail']['default']['from'];
175

Torsten Oppermann's avatar
Torsten Oppermann committed
176
			if (!filter_var($tsSettings['mail']['default']['from'], FILTER_VALIDATE_EMAIL)) {
177
178
				$this->fromAddress = 'noreply@example.org';
			} else {
Torsten Oppermann's avatar
Torsten Oppermann committed
179
				$this->fromAddress = $tsSettings['mail']['default']['from'];
180
			}
181
182
		}

183
		$this->mailMessage->setFrom($this->fromAddress);
184

Torsten Oppermann's avatar
Torsten Oppermann committed
185
186
		$this->bccAddresses = GeneralUtility::trimExplode(',', $tsSettings['mail']['default']['bcc']);
		$this->ccAddresses = GeneralUtility::trimExplode(',', $tsSettings['mail']['default']['cc']);
187
188
189
190
191
192
193
194
195
196
197
198
199

		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]);
			}
		}

200
		if (count($this->bccAddresses) > 0) {
201
202
203
			$this->mailMessage->setBcc($this->bccAddresses);
		}

204
		if (count($this->ccAddresses) > 0) {
205
206
			$this->mailMessage->setCc($this->ccAddresses);
		}
207
208
	}

Torsten Oppermann's avatar
Torsten Oppermann committed
209
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
210
	 * register a template with sg_mail
Fabian Galinski's avatar
Fabian Galinski committed
211
	 *
212
213
214
	 * 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
	 *
215
	 * @deprecated public usage of this function is deprecated. use registerByFile instead
216
	 * @param string $extension
Torsten Oppermann's avatar
Torsten Oppermann committed
217
218
	 * @param string $templateName
	 * @param string $templatePath
219
	 * @param mixed $description
220
	 * @param array $markers
221
	 * @param mixed $subject
222
	 * @param string $usage
Torsten Oppermann's avatar
Torsten Oppermann committed
223
	 */
224
	public static function registerTemplate(
225
		$extension, $templateName, $templatePath, $description, array $markers, $subject, $usage = ''
226
	) {
Torsten Oppermann's avatar
Torsten Oppermann committed
227
		self::$registerArray[$extension][$templateName] = [
228
			'templatePath' => $templatePath,
229
			'description' => $description,
230
			'marker' => $markers,
231
			'extension' => $extension,
232
			'templateName' => $templateName,
233
234
			'subject' => $subject,
			'usage' => $usage
235
236
		];
	}
237

238
239
240
	/**
	 * call in extlocalconf of an extension if you have a custom register class
	 *
Paul Ilea's avatar
Paul Ilea committed
241
242
	 * @param RegisterInterface $fileNameWithNamespace
	 * @param boolean $initObject Should the object initialize itself ?
243
244
	 *
	 * @return bool
Paul Ilea's avatar
Paul Ilea committed
245
	 * @throws \InvalidArgumentException
246
	 */
247
	public static function registerByFile($fileNameWithNamespace, $initObject = TRUE) {
248
249
250
251
252
253
		$registerObject = GeneralUtility::makeInstance($fileNameWithNamespace);
		// check instance of interface
		if (!($registerObject instanceof RegisterInterface)) {
			return FALSE;
		}

254
255
256
257
		// object calls registerTemplate, alternative way instead of localconf call
		if ($initObject) {
			$registerObject->init();
		}
258
259
260
261
		$registerObject->registerTemplate();
		return TRUE;
	}

262
263
264
265
266
267
268
269
270
	/**
	 * 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') {
271
		$languagePath = 'LLL:EXT:' . $extensionKey . '/Resources/Private/Language/locallang.xlf:' . $translationKey;
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291

		// 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;
	}

292
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
293
	 * Get all registered templates
Fabian Galinski's avatar
Fabian Galinski committed
294
	 *
295
	 * @return array
296
	 */
297
298
	public static function getRegisterArray() {
		return self::$registerArray;
299
	}
300
301

	/**
302
	 * Send the Email
303
	 *
Torsten Oppermann's avatar
Torsten Oppermann committed
304
	 * @param boolean $isPreview
305
	 * @return boolean email was sent or added to mail queue successfully?
306
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
307
	 */
308
	public function sendEmail($isPreview = FALSE) {
309
310
311
312
313
314
315
316
		if (TYPO3_MODE === 'FE') {
			/** @var TypoScriptFrontendController $tsfe */
			$tsfe = $GLOBALS['TSFE'];
			$pageUid = $tsfe->id;
		} else {
			$pageUid = (int) GeneralUtility::_GP('id');
		}

317
318
319
		if ($this->pid) {
			$pageUid = $this->pid;
		}
320
		$siteRootId = BackendService::getSiteRoot($pageUid);
321

322
		/** @var Template $template */
323
		$template = $this->templateRepository->findOneByTemplate(
324
			$this->extensionKey, $this->templateName, $this->language, $siteRootId
325
		);
326

327
328
329
330
331
332
		if ($template === NULL) {
			$template = $this->templateRepository->findOneByTemplate(
				$this->extensionKey, $this->templateName, 'default', $siteRootId
			);
		}

333
334
335
336
337
		// if there is a template, prefer those values
		if ($template) {
			$this->loadTemplateValues($template);
		}

Torsten Oppermann's avatar
Torsten Oppermann committed
338
		$defaultTemplateContent = NULL;
339
340
		// If there is no template for this language, use the default template
		if ($template === NULL) {
341

342
343
344
345
346
			$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 {
347
				$defaultTemplateFile = $templatePath . 'template.html';
348

349
350
351
352
353
				if (file_exists($defaultTemplateFile)) {
					$defaultTemplateContent = file_get_contents($defaultTemplateFile);
				} else {
					return FALSE;
				}
354
			}
355
		} elseif (filter_var($template->getToAddress(), FILTER_VALIDATE_EMAIL)) {
356
			$this->setToAddresses($template->getToAddress());
357
358
		}

Torsten Oppermann's avatar
Torsten Oppermann committed
359
360
		if ($isPreview) {
			$previewMarker = [];
Paul Ilea's avatar
Paul Ilea committed
361
			/** @var array $markerArray */
Torsten Oppermann's avatar
Torsten Oppermann committed
362
363
			$markerArray = self::$registerArray[$this->extensionKey][$this->templateName]['marker'];
			foreach ($markerArray as $marker) {
364
365
366
367
368
369
370
371
372
373
374
375
				$markerPath = GeneralUtility::trimExplode('.', $marker['marker']);
				$temporaryMarkerArray = [];
				foreach (array_reverse($markerPath) as $index => $markerPathSegment) {
					if ($index === 0) {
						if ($marker['backend_translation_key']) {
							$temporaryMarkerArray[$markerPathSegment] = LocalizationUtility::translate(
								$marker['backend_translation_key'], $marker['extension_key']
							);
						} else {
							$temporaryMarkerArray[$markerPathSegment] = $marker['value'];
						}
					} else {
376
						$temporaryMarkerArray = [$markerPathSegment => $temporaryMarkerArray];
377
					}
378
				}
379
				$previewMarker = array_merge_recursive($previewMarker, $temporaryMarkerArray);
Torsten Oppermann's avatar
Torsten Oppermann committed
380
			}
381
			$this->setIgnoreMailQueue(TRUE);
Torsten Oppermann's avatar
Torsten Oppermann committed
382
383
384
			$this->setMarkers($previewMarker);
		}

385
		/** @var StandaloneView $emailView */
386
		$emailView = $this->objectManager->get(StandaloneView::class);
387

388
		if (NULL === $defaultTemplateContent) {
389
			$emailView->setTemplateSource($template->getContent());
390
			$subject = $template->getSubject();
391
392
		} else {
			$emailView->setTemplateSource($defaultTemplateContent);
393
394
395
396
397
398
399
400
401
402

			$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
				);
			}
403
		}
404
		$this->mailMessage->setSubject($subject);
405

406
		$emailView->assignMultiple($this->markers);
407
		$emailBody = $emailView->render();
408

409
410
411
412
		// 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);
		if ($this->ignoreMailQueue) {
413

414
			$this->mailMessage->setBody($emailBody, 'text/html');
415
			$this->mailMessage->send();
416
			$dateTime = new DateTime();
417
			$currentTimestamp = $dateTime->getTimestamp();
418
419
420
421

			if (!$isPreview) {
				$this->addMailToMailQueue(
					$this->extensionKey, $this->templateName, $subject, $emailBody, $this->priority,
422
					$currentTimestamp, $currentTimestamp, $this->language, $siteRootId
423
424
				);
			}
425

426
		} else {
427
428
			if (!$isPreview) {
				$this->addMailToMailQueue(
429
					$this->extensionKey, $this->templateName, $subject, $emailBody, $this->priority, 0, 0,
430
431
432
					$this->language, $siteRootId
				);
			}
433
		}
434
435

		return TRUE;
436
437
438
	}

	/**
439
	 * Adds a new mail to the mail queue.
440
	 *
441
442
	 * @param string $extensionKey
	 * @param string $templateName
443
	 * @param string $subject
444
	 * @param string $emailBody
445
	 * @param int $sendingTime
446
	 * @param int $priority
447
	 * @param int $lastSendingTime
448
	 * @param string $language
449
	 * @param int $pid
Paul Ilea's avatar
Paul Ilea committed
450
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
451
	 */
452
	private function addMailToMailQueue(
453
		$extensionKey, $templateName, $subject, $emailBody, $priority, $sendingTime = 0,
454
		$lastSendingTime = 0, $language = self::DEFAULT_LANGUAGE, $pid = 0
455
	) {
456
		$mail = $this->objectManager->get(Mail::class);
457
		$mail->setPid($pid);
458
459
		$mail->setExtensionKey($extensionKey);
		$mail->setTemplateName($templateName);
460
		$mail->setLanguage($language);
461

462
		$mail->setFromAddress($this->fromAddress);
463
		$mail->setFromName($this->fromName);
464

465
		$mail->setToAddress($this->toAddresses);
466
		$mail->setMailSubject($subject);
467
		$mail->setMailBody($emailBody);
468
		$mail->setPriority($priority);
469
470
		$mail->setBccAddresses($this->bccAddresses);
		$mail->setCcAddresses($this->ccAddresses);
471
		$mail->setSendingTime($sendingTime);
472
		$mail->setLastSendingTime($lastSendingTime);
473
		$mail->setReplyTo($this->replyToAddress);
474

475
		$mailRepository = $this->objectManager->get(MailRepository::class);
476
		$mailRepository->add($mail);
477
		$this->persistenceManager->persistAll();
478
	}
479

480
481
482
483
	/**
	 * Send a Mail from the queue, identified by its id
	 *
	 * @param int $uid
Paul Ilea's avatar
Paul Ilea committed
484
485
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException
486
487
488
489
	 */
	public function sendMailFromQueue($uid) {
		$mailRepository = $this->objectManager->get(MailRepository::class);
		/** @var Mail $mailToSend */
490
		$mailToSend = $mailRepository->findOneByUid($uid);
491
492
493
494
495
496

		if ($mailToSend) {
			$this->mailMessage->setBody($mailToSend->getMailBody(), 'text/html');
			$this->mailMessage->setTo($mailToSend->getToAddress());
			$this->mailMessage->setFrom($mailToSend->getFromAddress(), $mailToSend->getFromName());
			$this->mailMessage->setSubject($mailToSend->getMailSubject());
497

498
			if ($mailToSend->getBccAddresses()) {
499
500
501
				$this->mailMessage->setBcc(GeneralUtility::trimExplode(',', $mailToSend->getBccAddresses()));
			}

502
			if ($mailToSend->getCcAddresses()) {
503
504
505
506
507
508
509
				$this->mailMessage->setCc(GeneralUtility::trimExplode(',', $mailToSend->getCcAddresses()));
			}

			if ($mailToSend->getReplyTo()) {
				$this->mailMessage->setReplyTo($mailToSend->getReplyTo());
			}

510
511
			$dateTime = new DateTime();
			$mailToSend->setLastSendingTime($dateTime->getTimestamp());
512
			$this->mailMessage->send();
513
			$mailRepository->update($mailToSend);
514
515
516
		}
	}

517
518
	/**
	 * @param array $registerArray
519
	 * @return void
520
	 */
521
	public static function setRegisterArray(array $registerArray) {
522
523
524
525
		self::$registerArray = $registerArray;
	}

	/**
526
	 * @param string $toAddresses
527
528
	 * @return MailTemplateService
	 */
529
530
531
	public function setToAddresses($toAddresses) {
		$this->toAddresses = $toAddresses;
		$this->mailMessage->setTo($toAddresses);
532
533
534
535
		return $this;
	}

	/**
536
	 * @param string $fromAddress
537
	 * @param string $fromName
538
539
	 * @return MailTemplateService
	 */
540
	public function setFromAddress($fromAddress, $fromName = '') {
541
542
543
544
545
		if ($fromAddress) {
			$this->fromAddress = $fromAddress;
			$this->mailMessage->setFrom($fromAddress, $fromName);
		}

546
547
548
549
		return $this;
	}

	/**
550
	 * @param string $ccAddresses
551
552
	 * @return MailTemplateService
	 */
553
	public function setCcAddresses($ccAddresses) {
554
555
		if ($ccAddresses) {
			$this->ccAddresses = $ccAddresses;
556
			$this->mailMessage->setCc(GeneralUtility::trimExplode(',', $this->ccAddresses));
557
558
		}

559
560
561
562
		return $this;
	}

	/**
563
	 * @param string $replyToAddress
564
565
	 * @return MailTemplateService
	 */
566
	public function setReplyToAddress($replyToAddress) {
567
568
569
570
571
		if ($replyToAddress) {
			$this->replyToAddress = $replyToAddress;
			$this->mailMessage->setReplyTo($replyToAddress);
		}

572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
		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;
	}

611
	/**
612
	 * @param array $markers
613
614
	 * @return MailTemplateService
	 */
615
616
	public function setMarkers(array $markers) {
		$this->markers = $markers;
617
618
		return $this;
	}
619
620

	/**
621
	 * @param string $bccAddresses
622
623
	 * @return MailTemplateService
	 */
624
	public function setBccAddresses($bccAddresses) {
625
626
		if ($bccAddresses) {
			$this->bccAddresses = $bccAddresses;
627
			$this->mailMessage->setBcc(GeneralUtility::trimExplode(',', $this->bccAddresses));
628
629
		}

630
631
632
		return $this;
	}

633
634
635
636
637
638
639
640
	/**
	 * @param int $priority
	 * @return MailTemplateService
	 */
	public function setPriority($priority) {
		$this->priority = $priority;
		return $this;
	}
641
642
643

	/**
	 * @param Swift_OutputByteStream $data
Paul Ilea's avatar
Paul Ilea committed
644
	 * @param string $filename
645
646
647
648
649
650
651
652
653
654
655
	 * @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;
	}
656
657
658
659
660
661
662
663

	/**
	 * @return MailMessage
	 */
	public function getMailMessage() {
		return $this->mailMessage;
	}

664
665
666
667
668
669
	/**
	 * use all values from the given template
	 *
	 * @param Template $template
	 */
	private function loadTemplateValues($template) {
670
671
672
673
674
675
676
677
678
679
680
681
682
683
		$fromName = $template->getFromName();
		if ($fromName === '' && $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName']) {
			$fromName = $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'];
		}

		$fromMail = $template->getFromMail();
		if (!filter_var($fromMail, FILTER_VALIDATE_EMAIL)) {
			$fromMail = $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'];
			if (!filter_var($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'], FILTER_VALIDATE_EMAIL)) {
				$fromMail = 'noreply@example.com';
			}
		}

		$this->setFromAddress($fromMail, $fromName);
684
685
686
		$this->setCcAddresses($template->getCc());
		$this->setBccAddresses($template->getBcc());
		$this->setReplyToAddress($template->getReplyTo());
687
		$this->setFromName($fromName);
688
689
690
691
692
693
694
695
		$this->setReplyToAddress($template->getReplyTo());
	}

	/**
	 * @param string $fromName
	 */
	public function setFromName($fromName) {
		$this->fromName = $fromName;
696
	}
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717

	/**
	 * Provides translation for the marker data type
	 *
	 * @param string $markerType
	 */
	public static function getReadableMarkerType($markerType) {
		switch ($markerType) {
			case self::MARKER_TYPE_STRING :
				LocalizationUtility::translate('backend.marker.type.string', 'sg_mail');
				break;
			case self::MARKER_TYPE_ARRAY :
				LocalizationUtility::translate('backend.marker.type.array', 'sg_mail');
				break;
			case self::MARKER_TYPE_OBJECT :
				LocalizationUtility::translate('backend.marker.type.object', 'sg_mail');
				break;
			default:
				LocalizationUtility::translate('backend.marker.type.mixed', 'sg_mail');
		}
	}
718
719
720
721
722
723
724
725
726
727
728

	/**
	 * set the page id from which this was called
	 *
	 * @param int $pid
	 * @return MailTemplateService
	 */
	public function setPid($pid) {
		$this->pid = (int) $pid;
		return $this;
	}
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763

	/**
	 * Iterate over all installed extensions and look for sg_mail configuration files
	 * If found, register the template(s)
	 *
	 * @throws \BadFunctionCallException
	 */
	public static function registerExtensions() {
		// clear registerArray
		self::$registerArray = [];

		$extensionList = ExtensionManagementUtility::getLoadedExtensionListArray();

		foreach ($extensionList as $extensionName) {
			$extensionConfigDirectory = ExtensionManagementUtility::extPath($extensionName);
			$extensionConfigDirectory .= '/Configuration/MailTemplates';
			$configFiles = GeneralUtility::getFilesInDir($extensionConfigDirectory);

			foreach ($configFiles as $configFile) {
				$configArray = (include $extensionConfigDirectory . '/' . $configFile);
				self::registerByConfigArray($configArray, $extensionName);
			}
		}
	}

	/**
	 * Register a template with a config array
	 *
	 * @param array $config
	 * @param string $extensionName
	 * @throws \BadFunctionCallException
	 */
	private static function registerByConfigArray(array $config = [], $extensionName) {
		$extensionKey = $config['extension_key'];
		$templateKey = $config['template_key'];
764
765
766
767
768
769
770
771

		// transform template directory name: your_templates => YourTemplates/
		$templateDirectoryParts = GeneralUtility::trimExplode('_', $config['template_key']);
		$templateDirectory = '';
		foreach ($templateDirectoryParts as $part) {
			$templateDirectory .= ucfirst($part);
		}
		$templateDirectory .= '/';
772
773
774
		$templatePath = ExtensionManagementUtility::extPath(
				$extensionName
			) . self::DEFAULT_TEMPLATE_PATH . $templateDirectory;
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792

		if ($config['template_path']) {
			$templatePath = $config['template_key'];
		}

		$description = $config['description'];
		$subject = $config['subject'];
		$marker = $config['markers'];

		self::$registerArray[$extensionKey][$templateKey] = [
			'templatePath' => $templatePath,
			'description' => $description,
			'marker' => $marker,
			'extension' => $extensionKey,
			'templateName' => $templateKey,
			'subject' => $subject
		];
	}
793
}