Mailer-Integration mit Symfony Mailer
Mailer-Integration mit Symfony Mailer
~16 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Zum Abschluss von Block 6 schließen wir den Kreis: Symfony Mailer versendet eine ECHTE E-Mail, sobald unser AufgabeZugewiesenEvent aus Kapitel 36 ausgelöst wird.
Symfony Mailer installieren
composer require symfony/mailerDie Recipe (Kapitel 6) fügt MAILER_DSN zu .env hinzu – ANALOG zu DATABASE_URL aus Kapitel 4, konfiguriert per Umgebungsvariable statt hartcodiert.
Den MAILER_DSN konfigurieren
# Für lokale Entwicklung: Mailpit/Mailhog (fängt E-Mails ab, versendet NICHTS wirklich)
MAILER_DSN=smtp://localhost:1025
# Für Produktion, Beispiel mit einem SMTP-Anbieter:
# MAILER_DSN=smtp://benutzer:passwort@smtp.anbieter.de:587Tipp: GENAU wie bei der Datenbank (Kapitel 2) empfiehlt sich für die lokale Entwicklung ein Docker-Container statt eines echten E-Mail-Versands – Mailpit (oder das ältere MailHog) fängt JEDE ausgehende E-Mail lokal ab und zeigt sie in einer Web-Oberfläche an, OHNE tatsächlich irgendwo zuzustellen. So lässt sich der Versand risikofrei testen.
Den Listener aus Kapitel 36 um E-Mail-Versand erweitern
<?php
declare(strict_types=1);
namespace App\EventListener;
use App\Event\AufgabeZugewiesenEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
#[AsEventListener]
class AufgabeZugewiesenListener
{
public function __construct(
private readonly MailerInterface $mailer,
) {
}
public function __invoke(AufgabeZugewiesenEvent $event): void
{
$aufgabe = $event->getAufgabe();
$nutzer = $event->getZugewiesenerNutzer();
$email = (new Email())
->from('noreply@aufgaben-manager.example')
->to($nutzer->getEmail())
->subject(sprintf('Neue Aufgabe: %s', $aufgabe->getTitel()))
->text(sprintf(
'Hallo %s,%sIhnen wurde die Aufgabe "%s" zugewiesen.',
$nutzer->getName(),
"\n\n",
$aufgabe->getTitel(),
));
$this->mailer->send($email);
}
}GENAU wie in Kapitel 36 angekündigt: TaskZuweisungsService wurde für diese Erweiterung NICHT ein einziges Mal angefasst – der bestehende Listener wurde einfach um MailerInterface UND die tatsächliche E-Mail-Erstellung ergänzt.
HTML-E-Mails mit Twig-Templates
Für ansprechender formatierte E-Mails nutzt Symfony Mailer dieselbe Twig-Engine wie unsere normalen Seiten (Kapitel 13):
<h1>Neue Aufgabe zugewiesen</h1>
<p>Hallo {{ nutzer.name }},</p>
<p>Ihnen wurde die Aufgabe <strong>{{ aufgabe.titel }}</strong> zugewiesen.</p>use Symfony\Bridge\Twig\Mime\TemplatedEmail;
$email = (new TemplatedEmail())
->from('noreply@aufgaben-manager.example')
->to($nutzer->getEmail())
->subject(sprintf('Neue Aufgabe: %s', $aufgabe->getTitel()))
->htmlTemplate('emails/aufgabe_zugewiesen.html.twig')
->context([
'aufgabe' => $aufgabe,
'nutzer' => $nutzer,
])
;
$this->mailer->send($email);TemplatedEmail statt Email, htmlTemplate() statt text(), context() übergibt Variablen an das Template – GENAU dasselbe Prinzip wie render() im Controller (Kapitel 13), nur für E-Mails statt Webseiten.
Ein Vorgriff: asynchroner Versand
E-Mail-Versand kann mehrere Sekunden dauern (Netzwerk-Latenz zum SMTP-Server) – läuft der Versand SYNCHRON innerhalb des dispatch()-Aufrufs aus Kapitel 36, wartet der NUTZER auf diese gesamte Zeit, bevor die Seite lädt. Symfonys Messenger-Komponente (bewusst außerhalb des Scopes dieser Schulung) würde den Versand stattdessen in eine Warteschlange auslagern, asynchron im Hintergrund verarbeitet – ein sinnvoller nächster Schritt für ein Produktions-System, aber ein eigenes, umfangreiches Thema.
Damit ist Block 6 (Services, Dependency Injection & Events) VOLLSTÄNDIG abgeschlossen – vom Grundprinzip (Kapitel 32) über eigene Services (Kapitel 33), Konfiguration (Kapitel 34), das Event-System (Kapitel 35-37) bis zum konkreten E-Mail-Feature. Block 7 widmet sich Console Commands und Testing – Automatisierung und Qualitätssicherung für unseren Aufgaben-Manager.