Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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/mailer

Die 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

.env
# 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:587

Tipp: 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

src/EventListener/AufgabeZugewiesenListener.php
<?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):

templates/emails/aufgabe_zugewiesen.html.twig
<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.