MailTemplateService.php 7.91 KB
Newer Older
1
2
3
4
<?php

namespace SGalinski\SgMail\Service;

5
6
use SGalinski\SgMail\Domain\Model\Mail;
use SGalinski\SgMail\Domain\Repository\MailRepository;
7
use TYPO3\CMS\Core\Mail\MailMessage;
8
use TYPO3\CMS\Core\Utility\GeneralUtility;
Torsten Oppermann's avatar
Torsten Oppermann committed
9
use TYPO3\CMS\Extbase\Object\ObjectManager;
10
use TYPO3\CMS\Fluid\View\StandaloneView;
11

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/***************************************************************
 *  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!
 ***************************************************************/
35
36
37
38

/**
 * MailTemplateService
 */
39
class MailTemplateService {
40

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

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

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

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

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

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

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

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

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

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

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

	/**
97
	 * @var string $subject
98
99
100
	 */
	private $subject;

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

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

113
114
115
116
117
118
	/**
	 * MailTemplateService constructor.
	 */
	public function __construct() {
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
		$this->mailMessage = $objectManager->get(MailMessage::class);
119
120
121
122

		$typoScriptSettingsService = $objectManager->get(TypoScriptSettingsService::class);
		$this->tsSettings = $typoScriptSettingsService->getSettings(0, 'tx_sgmail');
		$this->language = $this->tsSettings['templateDefaultLanguage'];
123
124
125
126
127
128
129
130

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

		$this->bccAddresses = explode(',', $this->tsSettings['mail']['default']['bcc']);
		$this->ccAddresses = explode(',', $this->tsSettings['mail']['default']['cc']);
		$this->mailMessage->setBcc($this->bccAddresses);
		$this->mailMessage->setBcc($this->ccAddresses);
131
132
	}

Torsten Oppermann's avatar
Torsten Oppermann committed
133
	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
134
	 * register a template with sg_mail
Fabian Galinski's avatar
Fabian Galinski committed
135
	 *
136
	 * @param string $extension
Torsten Oppermann's avatar
Torsten Oppermann committed
137
138
139
	 * @param string $templateName
	 * @param string $templatePath
	 * @param string $description
140
	 * @param array $markers
141
	 * @return string
Torsten Oppermann's avatar
Torsten Oppermann committed
142
	 */
143
	public static function registerTemplate($extension, $templateName, $templatePath, $description, array $markers) {
144

145
		MailTemplateService::$registerArray[$extension][$templateName] = [
146
			'templatePath' => $templatePath,
147
			'description' => $description,
148
			'marker' => $markers,
149
150
			'extension' => $extension,
			'templateName' => $templateName
151
152
		];
	}
153
154

	/**
Torsten Oppermann's avatar
Torsten Oppermann committed
155
	 * Get all registered templates
Fabian Galinski's avatar
Fabian Galinski committed
156
	 *
157
	 * @return array
158
	 */
159
160
	public static function getRegisterArray() {
		return self::$registerArray;
161
	}
162
163

	/**
164
	 * Send the Email
165
	 */
166
	public function sendEmail() {
167
		$templateEntry = self::$registerArray[$this->extensionKey][$this->templateName];
168

169
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
Torsten Oppermann's avatar
Torsten Oppermann committed
170
		$emailView = $objectManager->get(StandaloneView::class);
171
172
173
		$emailView->setTemplatePathAndFilename(
			$templateEntry['templatePath'] . $this->language . '.sg_mail.locallang.html'
		);
174
		$emailView->assignMultiple($this->markers);
175
		$emailBody = $emailView->render();
176

177
		if ($this->ignoreMailQueue) {
178
179
180
			// 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);
181
182

			$this->mailMessage->setSubject($this->subject);
183
			$this->mailMessage->setBody($emailBody, 'text/html');
184
			$this->mailMessage->send();
185
		} else {
186
			$this->addMailToMailQueue($emailBody);
187
		}
188
189
190
	}

	/**
191
	 * Adds a new mail to the mail queue.
192
	 *
193
	 * @param string $emailBody
194
195
	 * @param int $priority
	 * @param int $pid
196
197
	 */
	private function addMailToMailQueue($emailBody, $priority = Mail::PRIORITY_LOWEST, $pid = 0) {
198
199
200
201
202
203
204
205
206
		/** @var ObjectManager $objectManager */
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);

		if ($pid <= 0 && isset($GLOBALS['TSFE'])) {
			$pid = (int) $GLOBALS['TSFE']->id;
		}

		$mail = $objectManager->get(Mail::class);
		$mail->setPid($pid);
207
208
		$mail->setFromAddress($this->fromAddress);
		$mail->setToAddress($this->toAddresses);
209
210
		$mail->setMailSubject($this->subject);
		$mail->setMailBody($emailBody);
211
212
213
214
		$mail->setPriority($priority);

		$mailRepository = $objectManager->get(MailRepository::class);
		$mailRepository->add($mail);
215
	}
216
217
218
219
220

	/**
	 * @param array $registerArray
	 * @return MailTemplateService
	 */
221
	public static function setRegisterArray(array $registerArray) {
222
223
224
225
		self::$registerArray = $registerArray;
	}

	/**
226
	 * @param array|string $toAddresses
227
228
	 * @return MailTemplateService
	 */
229
230
231
	public function setToAddresses($toAddresses) {
		$this->toAddresses = $toAddresses;
		$this->mailMessage->setTo($toAddresses);
232
233
234
235
		return $this;
	}

	/**
236
	 * @param array|string $fromAddress
237
238
	 * @return MailTemplateService
	 */
239
	public function setFromAddress($fromAddress) {
240
241
		$this->fromAddress = $fromAddress;
		$this->mailMessage->setFrom($fromAddress);
242
243
244
245
		return $this;
	}

	/**
246
	 * @param array|string $ccAddresses
247
248
	 * @return MailTemplateService
	 */
249
	public function setCcAddresses($ccAddresses) {
250
251
		$this->ccAddresses[] = $ccAddresses;
		$this->mailMessage->setCc($this->ccAddresses);
252
253
254
255
		return $this;
	}

	/**
256
	 * @param array|string $replyToAddress
257
258
	 * @return MailTemplateService
	 */
259
	public function setReplyToAddress($replyToAddress) {
260
		$this->replyToAddress = $replyToAddress;
261
		$this->mailMessage->setReplyTo($replyToAddress);
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
		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;
	}

	/**
	 * @param string $subject
	 * @return MailTemplateService
	 */
	public function setSubject($subject) {
		$this->subject = $subject;
		$this->mailMessage->setSubject($subject);
		return $this;
	}
310
311

	/**
312
	 * @param array $markers
313
314
	 * @return MailTemplateService
	 */
315
316
	public function setMarkers(array $markers) {
		$this->markers = $markers;
317
318
		return $this;
	}
319
320
321
322
323
324

	/**
	 * @param array $bccAddresses
	 * @return MailTemplateService
	 */
	public function setBccAddresses(array $bccAddresses) {
325
326
		$this->bccAddresses[] = $bccAddresses;
		$this->mailMessage->setBcc($this->bccAddresses);
327
328
329
330
		return $this;
	}


331
}