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

37
38
39
/**
 * MailTemplateService
 */
40
class MailTemplateService {
41

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

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

	/**
53
	 * @var string $fromAddress
54
	 */
55
	private $fromAddress;
56
57

	/**
58
	 * @var array $ccAddresses
59
	 */
60
	private $ccAddresses = [];
61
62

	/**
63
	 * @var string $replyToAddress
64
	 */
65
	private $replyToAddress;
66
67

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

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

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

	/**
83
	 * @var string $templateName
84
85
86
87
	 */
	private $templateName;

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

	/**
93
	 * @var array $markers
94
	 */
95
	private $markers = [];
96

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

104
105
106
107
108
	/**
	 * @var array $bccAddresses
	 */
	private $bccAddresses = [];

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

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

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

126
127
128
129
130
131
	/**
	 * MailTemplateService constructor.
	 */
	public function __construct() {
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
		$this->mailMessage = $objectManager->get(MailMessage::class);
132
133
134
135

		$typoScriptSettingsService = $objectManager->get(TypoScriptSettingsService::class);
		$this->tsSettings = $typoScriptSettingsService->getSettings(0, 'tx_sgmail');
		$this->language = $this->tsSettings['templateDefaultLanguage'];
136
137
138
139

		$this->fromAddress = $this->tsSettings['mail']['default']['from'];
		$this->mailMessage->setFrom($this->fromAddress);

140
		$this->bccAddresses = GeneralUtility::trimExplode(',', $this->tsSettings['mail']['default']['bcc']);
141
142
143
144
145
146
147
148
149
150
151
152
153
154
		$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]);
			}
		}

155
		if (count($this->bccAddresses) > 0) {
156
157
158
			$this->mailMessage->setBcc($this->bccAddresses);
		}

159
		if (count($this->ccAddresses) > 0) {
160
161
			$this->mailMessage->setCc($this->ccAddresses);
		}
162
163
	}

Torsten Oppermann's avatar
Torsten Oppermann committed
164
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
165
	 * register a template with sg_mail
Fabian Galinski's avatar
Fabian Galinski committed
166
	 *
167
	 * @param string $extension
Torsten Oppermann's avatar
Torsten Oppermann committed
168
169
170
	 * @param string $templateName
	 * @param string $templatePath
	 * @param string $description
171
	 * @param array $markers
172
	 * @param array $subjects
Torsten Oppermann's avatar
Torsten Oppermann committed
173
	 */
174
175
176
	public static function registerTemplate(
		$extension, $templateName, $templatePath, $description, array $markers, array $subjects
	) {
177
		MailTemplateService::$registerArray[$extension][$templateName] = [
178
			'templatePath' => $templatePath,
179
			'description' => $description,
180
			'marker' => $markers,
181
			'extension' => $extension,
182
183
			'templateName' => $templateName,
			'subjects' => $subjects
184
185
		];
	}
186
187

	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
188
	 * Get all registered templates
Fabian Galinski's avatar
Fabian Galinski committed
189
	 *
190
	 * @return array
191
	 */
192
193
	public static function getRegisterArray() {
		return self::$registerArray;
194
	}
195
196

	/**
197
	 * Send the Email
198
	 *
Torsten Oppermann's avatar
Torsten Oppermann committed
199
	 * @param boolean $isPreview
200
	 * @return boolean email was sent or added to mail queue successfully?
201
	 */
202
	public function sendEmail($isPreview = FALSE) {
203
		/** @var Template $template */
204
		$template = $this->templateRepository->findOneByTemplate(
205
			$this->extensionKey, $this->templateName, $this->language
206
		);
207

208
209
210
211
212
213
214
215
		// 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
216
217
				$this->setLanguage('en');
				$this->sendEmail();
218
				return TRUE;
219
			}
220
221
		}

Torsten Oppermann's avatar
Torsten Oppermann committed
222
223
224
225
226
227
		if ($isPreview) {
			$previewMarker = [];
			$markerArray = self::$registerArray[$this->extensionKey][$this->templateName]['marker'];
			foreach ($markerArray as $marker) {
				$previewMarker[$marker['marker']] = $marker['value'];
			}
228
			$this->setIgnoreMailQueue(TRUE);
Torsten Oppermann's avatar
Torsten Oppermann committed
229
230
231
			$this->setMarkers($previewMarker);
		}

232
233
234
235
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
		/** @var StandaloneView $emailView */
		$emailView = $objectManager->get(StandaloneView::class);

236
237
		if (!isset($defaultTemplateContent)) {
			$emailView->setTemplateSource($template->getContent());
238
			$subject = $template->getSubject();
239
240
		} else {
			$emailView->setTemplateSource($defaultTemplateContent);
241
			$subject = self::$registerArray[$this->extensionKey][$this->templateName]['subjects'][$this->language];
242
		}
243
		$this->mailMessage->setSubject($subject);
244

245
		$emailView->assignMultiple($this->markers);
246
		$emailBody = $emailView->render();
247

248
249
250
		// 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);
251

252
		if ($this->ignoreMailQueue) {
253
			$this->addMailToMailQueue($subject, $emailBody, $this->priority, TRUE);
254
			$this->mailMessage->setBody($emailBody, 'text/html');
255
			$this->mailMessage->send();
256
		} else {
257
			$this->addMailToMailQueue($subject, $emailBody, $this->priority);
258
		}
259
260

		return TRUE;
261
262
263
	}

	/**
264
	 * Adds a new mail to the mail queue.
265
	 *
266
	 * @param string $subject
267
	 * @param string $emailBody
268
	 * @param int $priority
269
	 * @param bool $sent
270
	 */
271
	private function addMailToMailQueue($subject, $emailBody, $priority, $sent = FALSE) {
272
273
274
275
		/** @var ObjectManager $objectManager */
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);

		$mail = $objectManager->get(Mail::class);
276
277
		$mail->setFromAddress($this->fromAddress);
		$mail->setToAddress($this->toAddresses);
278
		$mail->setMailSubject($subject);
279
		$mail->setMailBody($emailBody);
280
		$mail->setPriority($priority);
281
282
		$mail->setBccAddresses(implode(',', $this->bccAddresses));
		$mail->setCcAddresses(implode(',', $this->ccAddresses));
283
		$mail->setSent($sent);
284
285
286

		$mailRepository = $objectManager->get(MailRepository::class);
		$mailRepository->add($mail);
287
		$this->persistenceManager->persistAll();
288
	}
289
290
291

	/**
	 * @param array $registerArray
292
	 * @return void
293
	 */
294
	public static function setRegisterArray(array $registerArray) {
295
296
297
298
		self::$registerArray = $registerArray;
	}

	/**
299
	 * @param string $toAddresses
300
301
	 * @return MailTemplateService
	 */
302
303
304
	public function setToAddresses($toAddresses) {
		$this->toAddresses = $toAddresses;
		$this->mailMessage->setTo($toAddresses);
305
306
307
308
		return $this;
	}

	/**
309
	 * @param string $fromAddress
310
311
	 * @return MailTemplateService
	 */
312
	public function setFromAddress($fromAddress) {
313
314
		$this->fromAddress = $fromAddress;
		$this->mailMessage->setFrom($fromAddress);
315
316
317
318
		return $this;
	}

	/**
319
	 * @param array|string $ccAddresses
320
321
	 * @return MailTemplateService
	 */
322
	public function setCcAddresses($ccAddresses) {
323
324
		$this->ccAddresses[] = $ccAddresses;
		$this->mailMessage->setCc($this->ccAddresses);
325
326
327
328
		return $this;
	}

	/**
329
	 * @param string $replyToAddress
330
331
	 * @return MailTemplateService
	 */
332
	public function setReplyToAddress($replyToAddress) {
333
		$this->replyToAddress = $replyToAddress;
334
		$this->mailMessage->setReplyTo($replyToAddress);
335
336
337
338
339
340
341
342
343
344
345
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
		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;
	}

374
	/**
375
	 * @param array $markers
376
377
	 * @return MailTemplateService
	 */
378
379
	public function setMarkers(array $markers) {
		$this->markers = $markers;
380
381
		return $this;
	}
382
383
384
385
386
387

	/**
	 * @param array $bccAddresses
	 * @return MailTemplateService
	 */
	public function setBccAddresses(array $bccAddresses) {
388
389
		$this->bccAddresses[] = $bccAddresses;
		$this->mailMessage->setBcc($this->bccAddresses);
390
391
392
		return $this;
	}

393
394
395
396
397
398
399
400
	/**
	 * @param int $priority
	 * @return MailTemplateService
	 */
	public function setPriority($priority) {
		$this->priority = $priority;
		return $this;
	}
401
}