§2 · Architektur
Wie ein selbstgehostetes E-Mail-Marketing-System tatsächlich funktioniert.
Ein Kampagnenversand durchläuft fünf Phasen. Sie zu verstehen ist die Voraussetzung dafür, Plattformen auszuwählen, ein Versand-Relay zu wählen und Zustellprobleme zu diagnostizieren, wenn eine Kampagne unterperformt.
[Marketer's browser]
│
▼ HTTPS POST /campaigns
[Web app — Laravel/Symfony/Go] ◀── REST API also lands here
│
▼ enqueue per-recipient job
[Job queue — Redis / beanstalkd / DB]
│
▼ worker picks job, renders MIME
[Sending driver — SES/Mailgun/SMTP]
│
▼ TLS, AUTH, DATA, .
[Mail Transfer Agent (MTA)]
│
▼ SMTP to recipient MX
[Recipient mail server — Gmail/O365/Yahoo]
│
▼ open pixel · click redirect · bounce · complaint
[Webhook back to web app] ◀── reputation feedback loop
Phase 1 — Kampagnenerstellung. Der Marketer erstellt eine Kampagne in der Web-Oberfläche: Betreffzeile, Absendername, Listenauswahl, Inhaltseditor (Drag-and-drop, MJML oder rohes HTML). Mit Klick auf "Senden" legt die Anwendung einen Kampagnen-Datensatz an und reiht pro Empfänger Jobs in eine Hintergrund-Queue ein. Noch verlässt nichts den Server.
Phase 2 — Queue + Worker. Hintergrund-Worker ziehen Jobs mit der konfigurierten Rate (typischerweise 5–50 Versendungen/Sekunde pro Worker). Der Worker holt den Abonnenten-Datensatz, fügt benutzerdefinierte Felder in die Vorlage ein, bettet ein Tracking-Pixel mit Message-ID-Schlüssel ein und schreibt jeden Link in einen Klick-Tracking-Redirect um. Das Ergebnis ist eine vollständig personalisierte MIME-Nachricht, bereit für die Übergabe an einen Sending-Driver.
Phase 3 — Sending-Driver. Der Driver ist der Adapter zwischen Ihrer Anwendung und dem gewählten Transport: ein Amazon-SES-API-Aufruf, ein Mailgun-HTTPS-POST, ein SendGrid-Web-API-Aufruf oder ein roher SMTP-AUTH PLAIN-Handshake mit Ihrem eigenen Postal-MTA. Das Sending-Driver-Pattern von AcelleMail definiert beispielsweise einen 5-Methoden-Vertrag (connect, send, getDeliveryStatus, getCapabilities, validateConfig), den jeder Driver implementiert — siehe /developers/sending-drivers für die vollständige Driver-Guideline. Mitgelieferte Driver gibt es für Amazon SES, SendGrid, Mailgun, SparkPost, Elastic Email, Gmail SMTP und jeden generischen SMTP-Server (8 Vendoren live in app/SendingServers/Drivers/Vendors/).
Phase 4 — MTA → Empfänger. Der MTA (Ihrer oder der des Relays) öffnet eine SMTP-Verbindung zum MX-Server des Empfängers, stellt sich mit HELO/EHLO vor, verhandelt STARTTLS, authentifiziert die DKIM-Signaturschlüssel und übermittelt die Nachricht. Der Empfänger-Mailserver führt Spam-Scoring, SPF-/DKIM-/DMARC-Verifizierung und List-Unsubscribe-Header-Verarbeitung durch — und stellt entweder zu oder lehnt ab.
Phase 5 — Feedback-Loop. Drei Signale kommen zurück, alle asynchron. Bounces treffen per SMTP ein (5xx-Codes für Hard Bounces, 4xx für Soft) oder per Webhook des Relays. Beschwerden (der Empfänger hat "Spam" geklickt) treffen über den Feedback-Loop des Mailbox-Providers ein oder, ebenfalls, per Relay-Webhook. Engagement (Pixel-Aufrufe, Klick-Redirect-Requests) trifft per einfachem HTTP zurück bei Ihrer Web-App ein. Die Anwendung nutzt diese Signale, um Sperrlisten zu aktualisieren, tote Adressen auszusortieren und die Kampagnen-Analytik zu speisen. Der Webhook-Event-Katalog von AcelleMail liegt in config/webhook_events.php — die kanonische Liste der Events, die die Anwendung emittiert und konsumiert.
Die Form ist auf jeder selbstgehosteten Plattform gleich, mit einer Variablen: wo Queue und MTA leben. Der Worker von AcelleMail läuft per Default auf derselben Box wie die Web-App; Listmonk macht es genauso; Mautic nutzt den Symfony Messenger und unterstützt separate Worker-Hosts. Der Mail-Relay kann lokal sein (Postal auf derselben Maschine, Postfix auf einer Schwester-Box) oder remote (SES, Mailgun) — diese Entscheidung ist Thema von §5.