MailTemplateService.php 10.7 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
38
use TYPO3\CMS\Fluid\View\StandaloneView;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

				return FALSE;
234
			}
235
236
		}

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

247
		/** @var StandaloneView $emailView */
248
		$emailView = $this->objectManager->get(StandaloneView::class);
249

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

259
		$emailView->assignMultiple($this->markers);
260
		$emailBody = $emailView->render();
261

262
263
264
		// 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);
265

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

		return TRUE;
275
276
277
	}

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

296
		$mailRepository = $this->objectManager->get(MailRepository::class);
297
		$mailRepository->add($mail);
298
		$this->persistenceManager->persistAll();
299
	}
300
301
302

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

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

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

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

	/**
340
	 * @param string $replyToAddress
341
342
	 * @return MailTemplateService
	 */
343
	public function setReplyToAddress($replyToAddress) {
344
		$this->replyToAddress = $replyToAddress;
345
		$this->mailMessage->setReplyTo($replyToAddress);
346
347
348
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
		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;
	}

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

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

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