MailTemplateService.php 12.2 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
use Swift_Attachment;
use Swift_OutputByteStream;
35
36
37
use TYPO3\CMS\Core\Mail\MailMessage;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
38
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
39
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
40
41
use TYPO3\CMS\Fluid\View\StandaloneView;

42
43
44
/**
 * MailTemplateService
 */
45
class MailTemplateService {
46

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

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

	/**
58
	 * @var string $fromAddress
59
	 */
60
	private $fromAddress;
61
62

	/**
63
	 * @var array $ccAddresses
64
	 */
65
	private $ccAddresses = [];
66
67

	/**
68
	 * @var string $replyToAddress
69
	 */
70
	private $replyToAddress;
71
72

	/**
73
	 * @var string $language
74
	 */
75
	private $language;
76
77

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

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

	/**
88
	 * @var string $templateName
89
90
91
92
	 */
	private $templateName;

	/**
93
	 * @var string $extensionKey
94
95
96
97
	 */
	private $extensionKey;

	/**
98
	 * @var array $markers
99
	 */
100
	private $markers = [];
101

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

109
110
111
112
113
	/**
	 * @var array $bccAddresses
	 */
	private $bccAddresses = [];

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

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

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

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

134
135
136
137
138
	/**
	 * @var array
	 */
	private $attachments = [];

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

		$this->fromAddress = $this->tsSettings['mail']['default']['from'];
		$this->mailMessage->setFrom($this->fromAddress);
158
		$this->bccAddresses = GeneralUtility::trimExplode(',', $this->tsSettings['mail']['default']['bcc']);
159
160
161
162
163
164
165
166
167
168
169
170
171
172
		$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]);
			}
		}

173
		if (count($this->bccAddresses) > 0) {
174
175
176
			$this->mailMessage->setBcc($this->bccAddresses);
		}

177
		if (count($this->ccAddresses) > 0) {
178
179
			$this->mailMessage->setCc($this->ccAddresses);
		}
180
181
	}

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

205
206
207
208
209
210
211
212
213
	/**
	 * 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') {
214
		$languagePath = 'LLL:EXT:' . $extensionKey . '/Resources/Private/Language/locallang.xlf:' . $translationKey;
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234

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

235
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
236
	 * Get all registered templates
Fabian Galinski's avatar
Fabian Galinski committed
237
	 *
238
	 * @return array
239
	 */
240
241
	public static function getRegisterArray() {
		return self::$registerArray;
242
	}
243
244

	/**
245
	 * Send the Email
246
	 *
Torsten Oppermann's avatar
Torsten Oppermann committed
247
	 * @param boolean $isPreview
248
	 * @return boolean email was sent or added to mail queue successfully?
249
	 */
250
	public function sendEmail($isPreview = FALSE) {
251
		/** @var Template $template */
252
		$template = $this->templateRepository->findOneByTemplate(
253
			$this->extensionKey, $this->templateName, $this->language
254
		);
255

256
257
258
259
260
261
262
263
		// 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
264
				$this->setLanguage('en');
265
266
267
268
269
270
271
				// does an english default template exist ?
				if (file_exists($templatePath . $this->language . '.template.html')) {
					$this->sendEmail();
					return TRUE;
				}

				return FALSE;
272
			}
273
274
		}

Torsten Oppermann's avatar
Torsten Oppermann committed
275
276
277
278
		if ($isPreview) {
			$previewMarker = [];
			$markerArray = self::$registerArray[$this->extensionKey][$this->templateName]['marker'];
			foreach ($markerArray as $marker) {
279
280
281
				$previewMarker[$marker['marker']] = LocalizationUtility::translate(
					$marker['backend_translation_key'], $marker['extension_key']
				);
Torsten Oppermann's avatar
Torsten Oppermann committed
282
			}
283
			$this->setIgnoreMailQueue(TRUE);
Torsten Oppermann's avatar
Torsten Oppermann committed
284
285
286
			$this->setMarkers($previewMarker);
		}

287
		/** @var StandaloneView $emailView */
288
		$emailView = $this->objectManager->get(StandaloneView::class);
289

290
291
		if (!isset($defaultTemplateContent)) {
			$emailView->setTemplateSource($template->getContent());
292
			$subject = $template->getSubject();
293
294
		} else {
			$emailView->setTemplateSource($defaultTemplateContent);
295
			$subject = self::$registerArray[$this->extensionKey][$this->templateName]['subjects'][$this->language];
296
		}
297
		$this->mailMessage->setSubject($subject);
298

299
		$emailView->assignMultiple($this->markers);
300
		$emailBody = $emailView->render();
301

302
303
304
		// 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);
305

306
		if ($this->ignoreMailQueue) {
307
			$this->addMailToMailQueue($subject, $emailBody, $this->priority, TRUE);
308
			$this->mailMessage->setBody($emailBody, 'text/html');
309
			$this->mailMessage->send();
310
		} else {
311
			$this->addMailToMailQueue($subject, $emailBody, $this->priority);
312
		}
313
314

		return TRUE;
315
316
317
	}

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

336
		$mailRepository = $this->objectManager->get(MailRepository::class);
337
		$mailRepository->add($mail);
338
		$this->persistenceManager->persistAll();
339
	}
340
341
342

	/**
	 * @param array $registerArray
343
	 * @return void
344
	 */
345
	public static function setRegisterArray(array $registerArray) {
346
347
348
349
		self::$registerArray = $registerArray;
	}

	/**
350
	 * @param string $toAddresses
351
352
	 * @return MailTemplateService
	 */
353
354
355
	public function setToAddresses($toAddresses) {
		$this->toAddresses = $toAddresses;
		$this->mailMessage->setTo($toAddresses);
356
357
358
359
		return $this;
	}

	/**
360
	 * @param string $fromAddress
361
362
	 * @return MailTemplateService
	 */
363
	public function setFromAddress($fromAddress) {
364
365
		$this->fromAddress = $fromAddress;
		$this->mailMessage->setFrom($fromAddress);
366
367
368
369
		return $this;
	}

	/**
370
	 * @param array|string $ccAddresses
371
372
	 * @return MailTemplateService
	 */
373
	public function setCcAddresses($ccAddresses) {
374
375
		$this->ccAddresses[] = $ccAddresses;
		$this->mailMessage->setCc($this->ccAddresses);
376
377
378
379
		return $this;
	}

	/**
380
	 * @param string $replyToAddress
381
382
	 * @return MailTemplateService
	 */
383
	public function setReplyToAddress($replyToAddress) {
384
		$this->replyToAddress = $replyToAddress;
385
		$this->mailMessage->setReplyTo($replyToAddress);
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
418
419
420
421
422
423
424
		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;
	}

425
	/**
426
	 * @param array $markers
427
428
	 * @return MailTemplateService
	 */
429
430
	public function setMarkers(array $markers) {
		$this->markers = $markers;
431
432
		return $this;
	}
433
434
435
436
437
438

	/**
	 * @param array $bccAddresses
	 * @return MailTemplateService
	 */
	public function setBccAddresses(array $bccAddresses) {
439
440
		$this->bccAddresses[] = $bccAddresses;
		$this->mailMessage->setBcc($this->bccAddresses);
441
442
443
		return $this;
	}

444
445
446
447
448
449
450
451
	/**
	 * @param int $priority
	 * @return MailTemplateService
	 */
	public function setPriority($priority) {
		$this->priority = $priority;
		return $this;
	}
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466

	/**
	 * @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;
	}
467
468
469
470
471
472
473
474

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

475
}