Skip to content
Snippets Groups Projects
MailTemplateService.php 36.5 KiB
Newer Older
	/**
	 * @param string $overwrittenEmailBody
	 */
	public function setOverwrittenEmailBody(string $overwrittenEmailBody) {
		$this->overwrittenEmailBody = $overwrittenEmailBody;
	}
	/**
	 * Parses markers in an email View.
	 * !!! CHANGES THE SOURCE PATH AND IT SHOULD BE RESET BACK TO THE ORIGINAL!!!
	 *
	 * @param string $text
	 * @param StandaloneView $emailView
	 * @return mixed
	 */
	protected function parseMarkers($text, $emailView) {
		$text = (string) $text;
		if (strpos($text, '{') !== FALSE) {
			$emailView->setTemplateSource($text);
			return $emailView->render();
Paul Ilea's avatar
Paul Ilea committed
	/**
	 * Returns the layout.
Paul Ilea's avatar
Paul Ilea committed
	 *
	 * @param int $layoutUid
	 * @param int $siteRootId
	private function getLayoutSource(int $layoutUid, int $siteRootId) {
Paul Ilea's avatar
Paul Ilea committed
		$languageUid = 0;
		if ($this->language !== self::DEFAULT_LANGUAGE) {
			$languageUid = (int) array_search($this->language, $this->getAvailableLanguages(), TRUE);
		}

		return $this->layoutRepository->findByUidOrDefault($layoutUid, $siteRootId, $languageUid);
	 * Returns the list of available translation languages
Paul Ilea's avatar
Paul Ilea committed
	 *
	 * @return array
	 */
	private function getAvailableLanguages(): array {
		$out = [0 => ''];
		if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) {
			$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
				'sys_language'
			);
			$rows = $queryBuilder->select('*')
				->from('sys_language')->execute()->fetchAll();

			foreach ($rows as $row) {
				$out[(int) $row['uid']] = $row['language_isocode'];
			}
		} else {
			try {
				$site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId(0);
			} catch (\Exception $exception) {
				return [0 => ''];
			}
			$availableLanguages = $site->getLanguages();
			$out = [];
			foreach ($availableLanguages as $language) {
				$languageId = $language->getLanguageId();
				if ($languageId < 0) {
					continue;
				}
				$out[$language->getLanguageId()] = strtolower($language->getTwoLetterIsoCode());
			}
		}
		return $out;
	}

	 * Adds a new mail to the mail queue.
	 * @param string $extensionKey
	 * @param string $templateName
	 * @param string $subject
	 * @param string $emailBody
	 * @param int $priority
	 * @param string $language
	 * @throws \InvalidArgumentException
	 * @throws \BadFunctionCallException
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
	 * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException
		$extensionKey, $templateName, $subject, $emailBody, $priority, $sendingTime = 0,
		$lastSendingTime = 0, $language = self::DEFAULT_LANGUAGE, $pid = 0
Torsten Oppermann's avatar
Torsten Oppermann committed
	): Mail {
		$mail = $this->objectManager->get(Mail::class);
		$mail->setExtensionKey($extensionKey);
		$mail->setTemplateName($templateName);
		$mail->setLanguage($language);
		$mail->setBlacklisted(self::isTemplateBlacklisted($extensionKey, $templateName, $pid));
		$mail->setFromAddress($this->fromAddress);
		$mail->setFromName($this->fromName);
		$mail->setToAddress($this->toAddresses);
		$mail->setMailSubject($subject);
		$mail->setMailBody($emailBody);
		$mail->setPriority($priority);
		$mail->setBccAddresses($this->bccAddresses);
		$mail->setCcAddresses($this->ccAddresses);
		$mail->setReplyTo($this->replyToAddress);
		foreach ($this->markers as $marker) {
			if ($marker instanceof FileReference) {
				// we need to create proper copies of the attachment so that the original file reference does not get
				// moved over to the mail model and worst case, the original model loses the reference because of this
				$originalResource = $marker->getOriginalResource();
				if ($originalResource instanceof \TYPO3\CMS\Core\Resource\FileReference) {
					$coreFileReferenceMailFile = $this->resourceFactory->createFileReferenceObject(
						[
							'uid_local' => $originalResource->getOriginalFile()->getUid(),
							'table_local' => 'sys_file',
							'uid' => uniqid('NEW_MAIL', TRUE)
						]
					);
					$newFileReference = GeneralUtility::makeInstance(FileReference::class);
					$newFileReference->setOriginalResource($coreFileReferenceMailFile);
					$mail->addAttachment($newFileReference);
				}
		$mailRepository = $this->objectManager->get(MailRepository::class);
		$this->persistenceManager->persistAll();
	 * @return string
	public function getSubjectToSend(): string {
		return $this->subjectToSend;
	}

	/**
	 * @param string $subjectToSend
	 */
	public function setSubjectToSend(string $subjectToSend): void {
		$this->subjectToSend = $subjectToSend;
	}

	/**
	 * @return string|string[]|null
	 */
	public function getMailBodyToSend() {
		return $this->mailBodyToSend;
	}

	/**
	 * @param string|string[]|null $mailBodyToSend
	 */
	public function setMailBodyToSend($mailBodyToSend): void {
		$this->mailBodyToSend = $mailBodyToSend;
	/**
	 * Send a Mail from the queue, identified by its id
	 *
	 * @param int $uid
	 * @return bool|NULL
	 * @throws \TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException
	public function sendMailFromQueue($uid): bool {
		$mailRepository = $this->objectManager->get(MailRepository::class);
		/** @var Mail $mailToSend */
		if (!isset(self::$mailObjectCache[$uid]) || !self::$mailObjectCache[$uid] instanceof Mail) {
			$mailToSend = $this->getMailObjectByUid($uid);
			if ($mailToSend === FALSE) {
		} else {
			$mailToSend = self::$mailObjectCache[$uid];
		$this->mailMessage->setBody($mailToSend->getMailBody(), 'text/html');
		$plaintextService = GeneralUtility::makeInstance(PlaintextService::class);
		$plaintextBody = $plaintextService->makePlain($mailToSend->getMailBody());
		$this->mailMessage->addPart($plaintextBody, 'text/plain');
		$toAddresses = \trim($mailToSend->getToAddress());
		$addressesArray = GeneralUtility::trimExplode(',', $toAddresses, TRUE);
		if (\count($addressesArray) > 1) {
			$toAddresses = $addressesArray;
		}
		$this->mailMessage->setTo($toAddresses);
		$this->mailMessage->setFrom($mailToSend->getFromAddress(), $mailToSend->getFromName());
		$this->mailMessage->setSubject($mailToSend->getMailSubject());
		if ($mailToSend->getBccAddresses()) {
			$this->mailMessage->setBcc(GeneralUtility::trimExplode(',', $mailToSend->getBccAddresses()));
		}
		if ($mailToSend->getCcAddresses()) {
			$this->mailMessage->setCc(GeneralUtility::trimExplode(',', $mailToSend->getCcAddresses()));
		}
		if ($mailToSend->getReplyTo()) {
			$this->mailMessage->setReplyTo($mailToSend->getReplyTo());
		}
		$attachments = $mailToSend->getAttachments();
		if ($attachments->count() > 0) {
			foreach ($attachments as $attachment) {
				/**
				 * @var FileReference $attachment
				 */
				$file = $attachment->getOriginalResource()->getOriginalFile();
				$this->mailMessage->attach(
					\Swift_Attachment::newInstance($file->getContents(), $file->getName(), $file->getMimeType())
				);
		$dateTime = new DateTime();
		if ((int) $mailToSend->getSendingTime() === 0) {
			$mailToSend->setSendingTime($dateTime->getTimestamp());
		}
		$mailToSend->setLastSendingTime($dateTime->getTimestamp());
		$success = $this->mailMessage->send();
		if ($success) {
			$mailRepository->update($mailToSend);
			$this->persistenceManager->persistAll();
		} else {
			$this->mailMessage->getFailedRecipients();
		}
		unset(self::$mailObjectCache[$uid]); // free the memory
	 * Get the mail object by uid and check if it's blacklisted
	 * @param int $uid
	 * @return bool|object
	private function getMailObjectByUid($uid) {
		$mailRepository = $this->objectManager->get(MailRepository::class);
		$mailObject = $mailRepository->findOneByUid($uid);
		if (!$mailObject || $mailObject->getBlacklisted()) {
			return FALSE;
		return $mailObject;