In dieser kurzen Anleitung erfahren Sie, wie Sie eine MailUtility für Ihre Extension einrichten und Mails via Symfony Mailer und Fluid Templates verschicken können.
1. Mail Utility Klasse erstellen
Zuerst legen wir eine Utility Klasse an. In meinem Beispiel nenne ich die Datei MailUtility.php. DIese wird unter EXT:<extname>/Classes/Utility/MailUtility.php angelegt.
Anschließend können Sie diesen Code einfügen und die Namespaces noch anpassen:
<?php
declare(strict_types=1);
namespace Vendor\Extkey\Utility;
use Symfony\Component\Mime\Email;
use TYPO3\CMS\Core\Mail\Mailer;
use TYPO3\CMS\Fluid\View\StandaloneView;
class MailUtility
{
Mailer $mailer;
public function __construct(
private readonly MailUtility $mailUtility
){}
/**
* Send a Fluid email with subject and body
*
* @param string $recipient Email recipient
* @param string $subject Subject of the email
* @return bool
*/
public function sendFluidMail(string $recipient, string $subject, string $body): bool
{
// Erstell ein Fluid Standalone View mit E-Mail Body
$fluidEmailView = new StandaloneView();
$fluidEmailView->setTemplatePathAndFilename('EXT:<ExtName>/Resources/Private/Templates/Mail/Email.html');
// Variablen ans FluidMail Template übergeben (Diese sind via Fluid verfügbar)
$fluidEmailView->assignMultiple([
'subject' => $subject,
'bodytext' => $body,
]);
// E-Mail Body rendern
$emailBody = $fluidEmailView->render();
// Symfony Mail Object erstellen
$email = (new Email())
//->from('your-email@example.com') // sender email, wenn nicht Standard TYPO3 Setting
->to($recipient)
->subject($subject)
->html($body);
// E-Mail versenden über Mailer service
//Hier könnte man auch besseres Error Handling implementieren, für dieses Beispiel reicht True/False für die Rückmeldung.
try {
$this->mailer->send($email);
return true;
} catch (\Throwable $th) {
return false;
}
}
}
2. Fluid Template für Mail erstellen
Als nächstes wird das Fluid Template erstellt, welches den Inhalt der Mail widerspiegeln soll. Dazu wird im oben genannten Pfad das Fluid Template erstellt (EXT:<ExtName>/Resources/Private/Templates/Mail/Email.html) und dann kann auch direkt mit Fluid gearbeitet werden:
<html
xmlns:f="http://typo3.org/ns/TYPO3/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:if condition="{subject}">
<h1 style="font-family: sans-serif;">{subject}</h1>
</f:if>
<f:if condition="{body}">
<div style="font-family: sans-serif;">{body -> f:format.html()}</div>
</f:if>
</html>
3. MailUtility im Einsatz
Nun können wir einfach den Namespace vom MailUtility nutzen, den wir erstellt haben und können mit den 3 Parametern die sendFluidMail Methode aufrufen:
<?php
use Vendor\Extname\Utility\MailUtility;
class ... {
public function __construct(
private readonly MailUtility $mailUtility
){}
/**
* action something
*
* @return \Psr\Http\Message\ResponseInterface
*/
public function somethingAction(): \Psr\Http\Message\ResponseInterface
{
if($this->mailUtility->sendFluidMail('receiver@mail.tld', 'Hello World', '<p>Dies ist HTML in einer Fluid Mail!!</p>') {
return $this->redirect('index'));
}
else {
return $this->redirect('index', null, null, array('error' => 'mailnotsent'));
}
}
}