MailTemplateService.php 11.6 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
30
31
use SGalinski\SgMail\Domain\Model\Mail;
use SGalinski\SgMail\Domain\Model\Template;
use SGalinski\SgMail\Domain\Repository\MailRepository;
32
use SGalinski\SgMail\Domain\Repository\TemplateRepository;
33
34
35
use TYPO3\CMS\Core\Mail\MailMessage;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
36
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
37
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
38
39
use TYPO3\CMS\Fluid\View\StandaloneView;

40
41
42
/**
 * MailTemplateService
 */
43
class MailTemplateService {
44

45
	/**
46
	 * @var array $registerArray
47
	 */
48
	private static $registerArray = [];
49

50
	/**
51
	 * @var array $toAddresses
52
	 */
53
	private $toAddresses = [];
54
55

	/**
56
	 * @var string $fromAddress
57
	 */
58
	private $fromAddress;
59
60

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

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

	/**
71
	 * @var string $language
72
	 */
73
	private $language;
74
75

	/**
76
	 * @var boolean $ignoreMailQueue
77
	 */
78
	private $ignoreMailQueue = FALSE;
79
80
81
82
83
84
85

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

	/**
86
	 * @var string $templateName
87
88
89
90
	 */
	private $templateName;

	/**
91
	 * @var string $extensionKey
92
93
94
95
	 */
	private $extensionKey;

	/**
96
	 * @var array $markers
97
	 */
98
	private $markers = [];
99

100
101
102
	/**
	 * holds the TypoScript configuration for sg_mail
	 *
103
	 * @var array $tsSettings
104
105
106
	 */
	private $tsSettings = [];

107
108
109
110
111
	/**
	 * @var array $bccAddresses
	 */
	private $bccAddresses = [];

112
113
114
115
116
	/**
	 * @var int
	 */
	private $priority = Mail::PRIORITY_LOWEST;

117
118
119
	/**
	 * @var \SGalinski\SgMail\Domain\Repository\TemplateRepository
	 */
120
121
122
123
124
125
	protected $templateRepository;

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

127
128
129
130
131
	/**
	 * @var \TYPO3\CMS\Extbase\Object\ObjectManager
	 */
	protected $objectManager;

132
133
134
135
	/**
	 * MailTemplateService constructor.
	 */
	public function __construct() {
136
137
138
139
140
141
		/** @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);
142
143
		$this->tsSettings = $typoScriptSettingsService->getSettings(0, 'tx_sgmail');
		$this->language = $this->tsSettings['templateDefaultLanguage'];
144
145
146
147
		/** @var TemplateRepository templateRepository */
		$this->templateRepository = $this->objectManager->get(TemplateRepository::class);
		/** @var PersistenceManager persistenceManager */
		$this->persistenceManager = $this->objectManager->get(PersistenceManager::class);
148
149
150

		$this->fromAddress = $this->tsSettings['mail']['default']['from'];
		$this->mailMessage->setFrom($this->fromAddress);
151
		$this->bccAddresses = GeneralUtility::trimExplode(',', $this->tsSettings['mail']['default']['bcc']);
152
153
154
155
156
157
158
159
160
161
162
163
164
165
		$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]);
			}
		}

166
		if (count($this->bccAddresses) > 0) {
167
168
169
			$this->mailMessage->setBcc($this->bccAddresses);
		}

170
		if (count($this->ccAddresses) > 0) {
171
172
			$this->mailMessage->setCc($this->ccAddresses);
		}
173
174
	}

Torsten Oppermann's avatar
Torsten Oppermann committed
175
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
176
	 * register a template with sg_mail
Fabian Galinski's avatar
Fabian Galinski committed
177
	 *
178
	 * @param string $extension
Torsten Oppermann's avatar
Torsten Oppermann committed
179
180
181
	 * @param string $templateName
	 * @param string $templatePath
	 * @param string $description
182
	 * @param array $markers
183
	 * @param array $subjects
Torsten Oppermann's avatar
Torsten Oppermann committed
184
	 */
185
186
187
	public static function registerTemplate(
		$extension, $templateName, $templatePath, $description, array $markers, array $subjects
	) {
188
		MailTemplateService::$registerArray[$extension][$templateName] = [
189
			'templatePath' => $templatePath,
190
			'description' => $description,
191
			'marker' => $markers,
192
			'extension' => $extension,
193
194
			'templateName' => $templateName,
			'subjects' => $subjects
195
196
		];
	}
197

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
	/**
	 * 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:sg_register/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;
	}

228
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
229
	 * Get all registered templates
Fabian Galinski's avatar
Fabian Galinski committed
230
	 *
231
	 * @return array
232
	 */
233
234
	public static function getRegisterArray() {
		return self::$registerArray;
235
	}
236
237

	/**
238
	 * Send the Email
239
	 *
Torsten Oppermann's avatar
Torsten Oppermann committed
240
	 * @param boolean $isPreview
241
	 * @return boolean email was sent or added to mail queue successfully?
242
	 */
243
	public function sendEmail($isPreview = FALSE) {
244
		/** @var Template $template */
245
		$template = $this->templateRepository->findOneByTemplate(
246
			$this->extensionKey, $this->templateName, $this->language
247
		);
248

249
250
251
252
253
254
255
256
		// 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's avatar
Torsten Oppermann committed
257
				$this->setLanguage('en');
258
259
260
261
262
263
264
				// does an english default template exist ?
				if (file_exists($templatePath . $this->language . '.template.html')) {
					$this->sendEmail();
					return TRUE;
				}

				return FALSE;
265
			}
266
267
		}

Torsten Oppermann's avatar
Torsten Oppermann committed
268
269
270
271
		if ($isPreview) {
			$previewMarker = [];
			$markerArray = self::$registerArray[$this->extensionKey][$this->templateName]['marker'];
			foreach ($markerArray as $marker) {
272
273
274
				$previewMarker[$marker['marker']] = LocalizationUtility::translate(
					$marker['backend_translation_key'], $marker['extension_key']
				);
Torsten Oppermann's avatar
Torsten Oppermann committed
275
			}
276
			$this->setIgnoreMailQueue(TRUE);
Torsten Oppermann's avatar
Torsten Oppermann committed
277
278
279
			$this->setMarkers($previewMarker);
		}

280
		/** @var StandaloneView $emailView */
281
		$emailView = $this->objectManager->get(StandaloneView::class);
282

283
284
		if (!isset($defaultTemplateContent)) {
			$emailView->setTemplateSource($template->getContent());
285
			$subject = $template->getSubject();
286
287
		} else {
			$emailView->setTemplateSource($defaultTemplateContent);
288
			$subject = self::$registerArray[$this->extensionKey][$this->templateName]['subjects'][$this->language];
289
		}
290
		$this->mailMessage->setSubject($subject);
291

292
		$emailView->assignMultiple($this->markers);
293
		$emailBody = $emailView->render();
294

295
296
297
		// 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);
298

299
		if ($this->ignoreMailQueue) {
300
			$this->addMailToMailQueue($subject, $emailBody, $this->priority, TRUE);
301
			$this->mailMessage->setBody($emailBody, 'text/html');
302
			$this->mailMessage->send();
303
		} else {
304
			$this->addMailToMailQueue($subject, $emailBody, $this->priority);
305
		}
306
307

		return TRUE;
308
309
310
	}

	/**
311
	 * Adds a new mail to the mail queue.
312
	 *
313
	 * @param string $subject
314
	 * @param string $emailBody
315
	 * @param int $priority
316
	 * @param bool $sent
317
	 */
318
	private function addMailToMailQueue($subject, $emailBody, $priority, $sent = FALSE) {
319
		$mail = $this->objectManager->get(Mail::class);
320
321
		$mail->setFromAddress($this->fromAddress);
		$mail->setToAddress($this->toAddresses);
322
		$mail->setMailSubject($subject);
323
		$mail->setMailBody($emailBody);
324
		$mail->setPriority($priority);
325
326
		$mail->setBccAddresses(implode(',', $this->bccAddresses));
		$mail->setCcAddresses(implode(',', $this->ccAddresses));
327
		$mail->setSent($sent);
328

329
		$mailRepository = $this->objectManager->get(MailRepository::class);
330
		$mailRepository->add($mail);
331
		$this->persistenceManager->persistAll();
332
	}
333
334
335

	/**
	 * @param array $registerArray
336
	 * @return void
337
	 */
338
	public static function setRegisterArray(array $registerArray) {
339
340
341
342
		self::$registerArray = $registerArray;
	}

	/**
343
	 * @param string $toAddresses
344
345
	 * @return MailTemplateService
	 */
346
347
348
	public function setToAddresses($toAddresses) {
		$this->toAddresses = $toAddresses;
		$this->mailMessage->setTo($toAddresses);
349
350
351
352
		return $this;
	}

	/**
353
	 * @param string $fromAddress
354
355
	 * @return MailTemplateService
	 */
356
	public function setFromAddress($fromAddress) {
357
358
		$this->fromAddress = $fromAddress;
		$this->mailMessage->setFrom($fromAddress);
359
360
361
362
		return $this;
	}

	/**
363
	 * @param array|string $ccAddresses
364
365
	 * @return MailTemplateService
	 */
366
	public function setCcAddresses($ccAddresses) {
367
368
		$this->ccAddresses[] = $ccAddresses;
		$this->mailMessage->setCc($this->ccAddresses);
369
370
371
372
		return $this;
	}

	/**
373
	 * @param string $replyToAddress
374
375
	 * @return MailTemplateService
	 */
376
	public function setReplyToAddress($replyToAddress) {
377
		$this->replyToAddress = $replyToAddress;
378
		$this->mailMessage->setReplyTo($replyToAddress);
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
		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;
	}

418
	/**
419
	 * @param array $markers
420
421
	 * @return MailTemplateService
	 */
422
423
	public function setMarkers(array $markers) {
		$this->markers = $markers;
424
425
		return $this;
	}
426
427
428
429
430
431

	/**
	 * @param array $bccAddresses
	 * @return MailTemplateService
	 */
	public function setBccAddresses(array $bccAddresses) {
432
433
		$this->bccAddresses[] = $bccAddresses;
		$this->mailMessage->setBcc($this->bccAddresses);
434
435
436
		return $this;
	}

437
438
439
440
441
442
443
444
	/**
	 * @param int $priority
	 * @return MailTemplateService
	 */
	public function setPriority($priority) {
		$this->priority = $priority;
		return $this;
	}
445
}