MailTemplateService.php 10.8 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

	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
199
	 * Get all registered templates
Fabian Galinski's avatar
Fabian Galinski committed
200
	 *
201
	 * @return array
202
	 */
203
204
	public static function getRegisterArray() {
		return self::$registerArray;
205
	}
206
207

	/**
208
	 * Send the Email
209
	 *
Torsten Oppermann's avatar
Torsten Oppermann committed
210
	 * @param boolean $isPreview
211
	 * @return boolean email was sent or added to mail queue successfully?
212
	 */
213
	public function sendEmail($isPreview = FALSE) {
214
		/** @var Template $template */
215
		$template = $this->templateRepository->findOneByTemplate(
216
			$this->extensionKey, $this->templateName, $this->language
217
		);
218

219
220
221
222
223
224
225
226
		// 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
227
				$this->setLanguage('en');
228
229
230
231
232
233
234
				// does an english default template exist ?
				if (file_exists($templatePath . $this->language . '.template.html')) {
					$this->sendEmail();
					return TRUE;
				}

				return FALSE;
235
			}
236
237
		}

Torsten Oppermann's avatar
Torsten Oppermann committed
238
239
240
241
		if ($isPreview) {
			$previewMarker = [];
			$markerArray = self::$registerArray[$this->extensionKey][$this->templateName]['marker'];
			foreach ($markerArray as $marker) {
242
243
244
				$previewMarker[$marker['marker']] = LocalizationUtility::translate(
					$marker['backend_translation_key'], $marker['extension_key']
				);
Torsten Oppermann's avatar
Torsten Oppermann committed
245
			}
246
			$this->setIgnoreMailQueue(TRUE);
Torsten Oppermann's avatar
Torsten Oppermann committed
247
248
249
			$this->setMarkers($previewMarker);
		}

250
		/** @var StandaloneView $emailView */
251
		$emailView = $this->objectManager->get(StandaloneView::class);
252

253
254
		if (!isset($defaultTemplateContent)) {
			$emailView->setTemplateSource($template->getContent());
255
			$subject = $template->getSubject();
256
257
		} else {
			$emailView->setTemplateSource($defaultTemplateContent);
258
			$subject = self::$registerArray[$this->extensionKey][$this->templateName]['subjects'][$this->language];
259
		}
260
		$this->mailMessage->setSubject($subject);
261

262
		$emailView->assignMultiple($this->markers);
263
		$emailBody = $emailView->render();
264

265
266
267
		// 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);
268

269
		if ($this->ignoreMailQueue) {
270
			$this->addMailToMailQueue($subject, $emailBody, $this->priority, TRUE);
271
			$this->mailMessage->setBody($emailBody, 'text/html');
272
			$this->mailMessage->send();
273
		} else {
274
			$this->addMailToMailQueue($subject, $emailBody, $this->priority);
275
		}
276
277

		return TRUE;
278
279
280
	}

	/**
281
	 * Adds a new mail to the mail queue.
282
	 *
283
	 * @param string $subject
284
	 * @param string $emailBody
285
	 * @param int $priority
286
	 * @param bool $sent
287
	 */
288
	private function addMailToMailQueue($subject, $emailBody, $priority, $sent = FALSE) {
289
		$mail = $this->objectManager->get(Mail::class);
290
291
		$mail->setFromAddress($this->fromAddress);
		$mail->setToAddress($this->toAddresses);
292
		$mail->setMailSubject($subject);
293
		$mail->setMailBody($emailBody);
294
		$mail->setPriority($priority);
295
296
		$mail->setBccAddresses(implode(',', $this->bccAddresses));
		$mail->setCcAddresses(implode(',', $this->ccAddresses));
297
		$mail->setSent($sent);
298

299
		$mailRepository = $this->objectManager->get(MailRepository::class);
300
		$mailRepository->add($mail);
301
		$this->persistenceManager->persistAll();
302
	}
303
304
305

	/**
	 * @param array $registerArray
306
	 * @return void
307
	 */
308
	public static function setRegisterArray(array $registerArray) {
309
310
311
312
		self::$registerArray = $registerArray;
	}

	/**
313
	 * @param string $toAddresses
314
315
	 * @return MailTemplateService
	 */
316
317
318
	public function setToAddresses($toAddresses) {
		$this->toAddresses = $toAddresses;
		$this->mailMessage->setTo($toAddresses);
319
320
321
322
		return $this;
	}

	/**
323
	 * @param string $fromAddress
324
325
	 * @return MailTemplateService
	 */
326
	public function setFromAddress($fromAddress) {
327
328
		$this->fromAddress = $fromAddress;
		$this->mailMessage->setFrom($fromAddress);
329
330
331
332
		return $this;
	}

	/**
333
	 * @param array|string $ccAddresses
334
335
	 * @return MailTemplateService
	 */
336
	public function setCcAddresses($ccAddresses) {
337
338
		$this->ccAddresses[] = $ccAddresses;
		$this->mailMessage->setCc($this->ccAddresses);
339
340
341
342
		return $this;
	}

	/**
343
	 * @param string $replyToAddress
344
345
	 * @return MailTemplateService
	 */
346
	public function setReplyToAddress($replyToAddress) {
347
		$this->replyToAddress = $replyToAddress;
348
		$this->mailMessage->setReplyTo($replyToAddress);
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
		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;
	}

388
	/**
389
	 * @param array $markers
390
391
	 * @return MailTemplateService
	 */
392
393
	public function setMarkers(array $markers) {
		$this->markers = $markers;
394
395
		return $this;
	}
396
397
398
399
400
401

	/**
	 * @param array $bccAddresses
	 * @return MailTemplateService
	 */
	public function setBccAddresses(array $bccAddresses) {
402
403
		$this->bccAddresses[] = $bccAddresses;
		$this->mailMessage->setBcc($this->bccAddresses);
404
405
406
		return $this;
	}

407
408
409
410
411
412
413
414
	/**
	 * @param int $priority
	 * @return MailTemplateService
	 */
	public function setPriority($priority) {
		$this->priority = $priority;
		return $this;
	}
415
}