Leitfaden · E-Mail-API
Wie sollte ein Produktteam eine E-Mail-API sicher implementieren?
Implementieren Sie eine E-Mail-API als asynchronen Workflow mit Berechtigungsprüfung, nicht als direkten Aufruf vom Formular zum Provider. Authentifizieren Sie den Aufrufer, bestätigen Sie, dass die verifizierte From-Domain dem Mandanten gehört, validieren Sie die Nachricht und prüfen Sie ihre Größe, vergeben Sie eine stabile Job-ID in der Anwendung, stellen Sie den Job genau einmal in die Warteschlange und senden Sie aus einem Worker. Speichern Sie bei Annahme die Nachrichten-ID des Providers, verarbeiten Sie Zustell-Events idempotent und setzen Sie dauerhafte Bounces und Beschwerden auf die Sperrliste. Nutzen Sie begrenzte Wiederholungsversuche nur, wenn das Risiko von Duplikaten kontrolliert ist. Halten Sie Zugangsdaten serverseitig, minimieren Sie Nachrichtendaten in Logs und unterscheiden Sie zwischen Annahme durch die API, Zustellung an den Mailserver und Platzierung im Posteingang.
Die API-Grenze definieren, bevor Sie einen Provider wählen
Eine E-Mail-API sollte die Absicht der Anwendung abbilden, ohne jedes Provider-Detail in den Produktcode durchsickern zu lassen. Definieren Sie Ressourcen für Nachrichten, Absenderdomains, API-Schlüssel, Events und Sperrlisteneinträge. Legen Sie fest, welche Felder Aufrufer steuern dürfen, darunter From, To, Reply-To, Betreff, Text, HTML und eine kleine Allowlist von Headern. Lehnen Sie vom Aufrufer gelieferte Transport-Header ab, die mit der Signierung oder dem Routing des Providers kollidieren könnten. Behandeln Sie den Versand als folgenreichen Schreibvorgang: Die Antwort sollte eine Nachrichtenressource der Anwendung und ihren aktuellen Zustand benennen, nicht ein Ergebnis im Postfach suggerieren. Halten Sie Provider-Konto, Region, Configuration Set und Transport-IDs hinter einem Adapter. Diese Grenze macht einen Provider-Wechsel möglich und gibt Autorisierung, Aufbewahrung und Missbrauchskontrollen einen stabilen Ort.
Aufrufer authentifizieren und jede Absenderdomain autorisieren
Speichern Sie API-Schlüssel nur als Einweg-Hashes und zeigen Sie das vollständige Geheimnis nur einmal an. Geben Sie jedem Schlüssel einen Workspace als Eigentümer, einen Status, einen Erstellungszeitpunkt und einen Weg zum Widerruf; fügen Sie engere Berechtigungen hinzu, wenn eine Integration nur senden oder nur Events lesen soll. Authentifizierung beantwortet, wer Zugangsdaten vorgelegt hat, während Autorisierung entscheidet, ob dieser Principal die angeforderte From-Domain und Nachrichtenressource verwenden darf. Prüfen Sie die Domain-Inhaberschaft bei jedem Versand, auch bei Batch-Endpunkten, statt einer vom Client gelieferten Domain-ID zu vertrauen. Verlangen Sie die Verifizierung beim Provider, bevor Sie Produktiv-Traffic freischalten. Legen Sie niemals Provider-Zugangsdaten oder Workspace-API-Schlüssel in Browser-JavaScript, Query-Strings, Analytics oder Fehlermeldungen ab. Autorisierung auf Objektebene ist in einer mandantenfähigen API besonders wichtig für IDs von Nachrichten, Events, Sperrlisteneinträgen, Postfächern und Domains.
Domain verifizieren und Authentifizierung ausrichten
Eine Absenderdomain braucht mehr als ein Flag in der Datenbank. Schließen Sie die Inhaberschaftsprüfung des Providers ab und veröffentlichen Sie die erforderlichen DKIM-Einträge. SPF autorisiert Hosts für die SMTP-Identität MAIL FROM oder HELO, während DKIM eine Signierdomain mit einer kryptografischen Signatur der Nachricht verknüpft. DMARC wertet aus, ob ein erfolgreicher SPF- oder DKIM-Identifikator mit der sichtbaren From-Domain nach RFC 5322 ausgerichtet ist, und erlaubt dem Domaininhaber, eine Richtlinie für Behandlung und Berichte zu veröffentlichen. Hat eine Domain bereits SPF, führen Sie den erforderlichen Mechanismus in den bestehenden Eintrag ein; laut RFC 7208 darf eine Domain keine mehreren Einträge veröffentlichen, die zur Auswahl von mehr als einem SPF-Eintrag führen. Führen Sie strengere DMARC-Richtlinien erst ein, wenn kontrollierte Nachrichten und Aggregatberichte zeigen, dass jeder legitime Absender ausgerichtet ist. Authentifizierung verringert die unbefugte Nutzung der Domain, sichert aber keine Platzierung im Posteingang.
Nachrichtenstruktur validieren und angenommene Eingaben minimieren
RFC 5322 definiert eine Internet-Nachricht als Header-Felder, gefolgt von einem optionalen Body; die MIME-Spezifikationen erweitern die Inhalte über einfachen Text hinaus. Eine API kann die meisten Details des Übertragungsformats verbergen und sie trotzdem durchsetzen. Normalisieren Sie Empfänger-Arrays, begrenzen Sie die Empfängerzahl und die gesamte kodierte Größe, verlangen Sie mindestens einen Text- oder HTML-Body und validieren Sie Adressen, ohne so zu tun, als belege die Syntax, dass ein Postfach existiert. Entfernen Sie Wagenrücklauf- und Zeilenvorschubzeichen aus Feldern, die zu Headern werden. Erzeugen Sie die Message-ID selbst oder überlassen Sie das dem Provider; verwenden Sie sie nicht als Job-ID der Anwendung, denn eine neue Version einer Nachricht kann legitim eine neue ID erhalten. Erlauben Sie nur dokumentierte benutzerdefinierte Header, lehnen Sie Duplikate geschützter Felder ab und rendern Sie Templates vor der Übergabe an den Provider, damit fehlende Variablen in einem kontrollierten Anwendungszustand fehlschlagen.
Einmal in die Warteschlange stellen und stabile Anwendungs-IDs verwenden
Eine Nutzeranfrage sollte in einer Transaktion genau einen dauerhaften Nachrichtenjob anlegen; anschließend führt ein Worker den Provider-Aufruf aus. Geben Sie dem Job eine stabile ID und speichern Sie einen Fingerabdruck der Anfrage oder einen vom Aufrufer gelieferten Idempotenzschlüssel, sofern der Vertrag das unterstützt. HTTP definiert POST standardmäßig als nicht idempotent und rät von automatischen Wiederholungen ab, sofern der Client nicht weiß, dass die Operation effektiv idempotent ist oder dass die ursprüngliche Anfrage nicht angewendet wurde. Das ist bei E-Mails wichtig, denn ein Timeout kann auftreten, nachdem der Provider die Nachricht angenommen hat, aber bevor der Worker die Antwort erhalten hat. Gleichen Sie bei unklaren Fehlern zuerst den gespeicherten Job mit dem Zustand beim Provider ab, statt einen neuen Versand anzulegen. Nutzen Sie ein Outbox-Muster, wenn Anwendungszustand und Veröffentlichung in der Warteschlange gemeinsam erfolgen müssen, und setzen Sie eine Eindeutigkeitsbedingung an die Idempotenzgrenze.
Wiederholungsversuche nach Fehlerklassen gestalten
Unterscheiden Sie Validierung, Autorisierung, Drosselung, Ablehnung durch den Provider, vorübergehende Transportfehler und Zustellfehler beim Empfänger. Ungültige Eingaben und eine nicht autorisierte From-Domain sollten ohne Wiederholung fehlschlagen. Rate-Limits des Providers und vorübergehende Dienstfehler lassen sich mit begrenztem exponentiellem Backoff, Jitter, einer Obergrenze für Versuche und einem Visibility-Timeout der Warteschlange wiederholen, der länger ist als die Anfragefrist des Workers. Ein unklarer Netzwerk-Timeout erfordert einen Abgleich, der Duplikate berücksichtigt, statt einer bedingungslosen neuen Anfrage. SMTP selbst unterscheidet vorübergehende 4xx- und dauerhafte 5xx-Antworten, doch eine Anwendung, die eine Provider-API nutzt, sollte der dokumentierten Fehlersemantik dieses Providers folgen. Verschieben Sie ausgeschöpfte Jobs in einen prüfbaren Dead-Letter-Zustand und bewahren Sie den bereinigten Grund auf. Wiederholen Sie keinen dauerhaften Bounce beim Empfänger, als wäre er ein API-Ausfall, und machen Sie aus einer Beschwerde keinen weiteren Versandversuch.
Annahme speichern und Zustell-Events verarbeiten
Speichern Sie die Provider-Nachrichtenkennung unmittelbar nach der Annahme und ordnen Sie sie der Anwendungs-Nachrichten-ID zu. Provider-Events können dann die richtige Ressource aktualisieren, selbst wenn ein Beschwerdebericht Empfängerdetails schwärzt. Amazon SES unterscheidet beispielsweise erfolgreiche Sendung von Zustellung an den Mailserver des Empfängers und kann Events für Zustellung, Bounce, Beschwerde, Ablehnung, Zustellverzögerung, Rendering-Fehler, Öffnen und Klick veröffentlichen. Prüfen Sie die Webhook-Echtheit mit dem dokumentierten Provider-Mechanismus, validieren Sie das Event-Schema, deduplizieren Sie nach Provider-Eventkennung oder deterministischem Fingerprint und erlauben Sie die wiederholte Zustellung desselben Events ohne wiederholte Seiteneffekte. Speichern Sie rohe Payloads nur bei Bedarf, verschlüsselt, zugriffsgesteuert und mit begrenzter Aufbewahrung. Der normalisierte Zustand soll zwischen den Ergebnissen „angenommen“, „an Server zugestellt“, „gebounct“, „Beschwerde eingegangen“, „verzögert“, „abgelehnt“ und „gesperrt“ unterscheiden.
Die Sperrliste zur Kontrolle beim Versand machen
Ein Sperrlisteneintrag sollte vor jeder Übergabe an den Provider geprüft werden, nicht nur in einem Dashboard angezeigt. Dauerhaft gebouncte Adressen und Beschwerden erfordern normalerweise eine Sperre; vorübergehende Zustellverzögerungen brauchen eine andere Richtlinie. Legen Sie den Geltungsbereich der Sperrliste bewusst fest. Eine kontoweite Liste kann die gemeinsame Reputation schützen, kann aber dazu führen, dass das Empfängerergebnis eines Mandanten einen anderen Mandanten blockiert. Eine mandantenbezogene Liste verringert diese Kopplung, braucht aber trotzdem eine Schicht für Missbrauchsschutz und Plattformsicherheit. Erfassen Sie Grund, auslösendes Event, Mandant, Erstellungszeitpunkt und einen kontrollierten Weg zur Entfernung. Das Entfernen einer Sperre wegen Beschwerde oder dauerhaftem Bounce ist folgenreich und sollte eine bewusste Prüfung sowie Belege erfordern, dass die Adresse gültig ist und der Empfänger die Nachricht erwartet. Kopieren Sie keine rohen Empfängeradressen in allgemeine Logs oder Experimente; der Betriebsspeicher kann die Versandrichtlinie durchsetzen, während Analysen mit aggregierten Zahlen arbeiten.
Batch-Versand und sensible Geschäftsabläufe schützen
Ein Batch-Endpunkt vervielfacht die Auswirkungen eines Autorisierungs- oder Validierungsfehlers. Wenden Sie dieselben Prüfungen für Domain-Inhaberschaft, Sperrliste, Größe und Inhalt auf jedes Element an, legen Sie eine strikte maximale Batch-Länge fest und geben Sie Ergebnisse pro Element zurück, ohne Daten anderer Mandanten preiszugeben. Rate-Limits sollten auf Ebene von Zugangsdaten, Workspace, Domain und Provider bestehen, mit getrennten Kontrollen für Spitzen und rollierendes Volumen. Ein einzelnes globales Limit für Anfragen pro Sekunde reicht nicht, denn eine Anfrage kann viele Empfänger enthalten. Verlangen Sie in agentengesteuerten Tools eine bewusste Bestätigung, bevor ein folgenreicher Batch übermittelt wird. Trennen Sie Berechtigungen für transaktionale und Marketing-E-Mails, wenn sich deren Einwilligungs- und Betriebsregeln unterscheiden. Überwachen Sie ungewöhnliches Empfängerwachstum, wiederholt abgelehnte Domains, starke Veränderungen bei Bounces oder Beschwerden und die schnelle Erstellung von Schlüsseln. Rate-Limiting unterstützt die Sicherheit, ersetzt aber weder Authentifizierung noch Objektautorisierung, verifizierte Einwilligung oder Reaktion auf Missbrauch.
Fehlerpfade vor dem Produktivbetrieb testen
Testen Sie mit Provider-Simulatoren oder kontrollierten Postfächern Annahme, Zustellung an den empfangenden Server, Hard Bounce, Beschwerde, Verzögerung, ungültige Domain, widerrufenen Schlüssel, Drosselung, Provider-Timeout, doppelten Webhook und erneute Zustellung aus der Warteschlange. Stellen Sie sicher, dass derselbe Idempotenzschlüssel genau eine Anwendungsnachricht erzeugt, dass ein wiederholtes Event keine doppelte Nebenwirkung auslöst und dass ein Mandant weder mit der Domain noch mit der Nachrichten-ID eines anderen Mandanten lesen oder senden kann. Prüfen Sie eine echte empfangene Nachricht auf From, Return-Path, DKIM, SPF, DMARC-Alignment, Darstellung von Text und HTML, gegebenenfalls das Abmeldeverhalten sowie Links. Führen Sie Lasttests für die Warteschlange unterhalb der freigegebenen Provider-Limits durch und prüfen Sie den Backpressure-Mechanismus, statt ihn zu umgehen. Richten Sie Alarme ein für das Alter der Warteschlange, ausgeschöpfte Wiederholungsversuche, Fehler bei der Event-Verarbeitung, Spielraum im Kontingent, Veränderungen bei Bounces und Beschwerden sowie fehlende Callbacks des Providers. Eine Launch-Checkliste sollte für jeden Alarm und jede Wiederherstellungsmaßnahme einen Verantwortlichen nennen.
Das Muster mit SendHQ sorgfältig anwenden
SendHQ stellt auf den Workspace beschränkte Bearer-Schlüssel, Prüfungen verifizierter From-Domains, Erstellung einzelner und gebündelter Nachrichten, Inbound-Postfächer, Nachrichten-Events und Sperrlisten-Ressourcen bereit. Diese Funktionen unterstützen die Architektur dieses Leitfadens: Bewahren Sie den Schlüssel serverseitig auf, erstellen Sie eine Nachrichtenressource, behalten Sie ihre ID und lesen Sie spätere Events, statt die erste Antwort als endgültige Zustellung zu behandeln. Unabhängig von der Plattform bleiben Aufrufer für beabsichtigte Empfänger, rechtmäßige und erwartete E-Mails, Inhaltsgenauigkeit und sorgfältige Genehmigung folgenreicher Sendungen verantwortlich.
Häufig gestellte Fragen
Sollte eine E-Mail-API synchron aus der Web-Anfrage heraus senden?
In der Regel nicht. Legen Sie eine dauerhafte Anwendungsnachricht an, stellen Sie sie in die Warteschlange und lassen Sie dann einen Worker den Provider aufrufen. Das isoliert Latenz, ermöglicht begrenzte Wiederholungsversuche und erleichtert den Abgleich unklarer Provider-Ergebnisse.
Wie verhindere ich doppelte E-Mails, wenn eine Anfrage in einen Timeout läuft?
Verwenden Sie eine stabile Job-ID in der Anwendung und eine Idempotenzgrenze mit Eindeutigkeitsbedingung. Gleichen Sie bei einem unklaren Timeout den bestehenden Job ab, bevor Sie eine weitere Übergabe an den Provider mit neuer Identität auslösen.
Bedeutet eine erfolgreiche Antwort der E-Mail-API, dass zugestellt wurde?
Nein. Sie zeigt normalerweise an, dass die API oder der Provider die Anfrage angenommen hat. Nutzen Sie spätere Events, um Zustellung an den empfangenden Server, Bounce, Beschwerde, Verzögerung, Ablehnung und Sperre von der ersten Annahme zu unterscheiden.
Welche DNS-Einträge braucht eine E-Mail-API?
Die genauen Einträge hängen vom Provider ab, doch für den Produktivversand sind in der Regel Domain-Verifizierung und DKIM nötig, dazu eine korrekte SPF-Strategie und eine DMARC-Richtlinie, die zu den legitimen Versandströmen passt.
Sollten API-Schlüssel im Browser-Code gespeichert werden?
Nein. Bewahren Sie Workspace- und Provider-Zugangsdaten in einem serverseitigen Secret Store auf, speichern Sie API-Schlüssel der Anwendung möglichst gehasht, zeigen Sie vollständige Geheimnisse nur einmal an und bieten Sie schnelle Wege zu Widerruf und Rotation.
Wie sollte eine E-Mail-API mit dauerhaften Bounces umgehen?
Normalisieren Sie das Provider-Event, ordnen Sie es der Anwendungsnachricht zu und sperren Sie künftige Routine-Sendungen an diesen Empfänger im vorgesehenen Geltungsbereich. Das Entfernen sollte bewusst und durch Belege gestützt erfolgen.
Quellen
- RFC 9110: HTTP Semantics — Internet Engineering Task Force (IETF)
- RFC 5321: Simple Mail Transfer Protocol (SMTP) — Internet Engineering Task Force (IETF)
- RFC 5322: Internet Message Format (IMF) — Internet Engineering Task Force (IETF)
- RFC 6376: DomainKeys Identified Mail (DKIM) Signatures — Internet Engineering Task Force (IETF)
- RFC 7208: Sender Policy Framework (SPF) — Internet Engineering Task Force (IETF)
- RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC) — Internet Engineering Task Force (IETF)
- Versandaktivität in Amazon SES überwachen — Amazon Web Services
- Fehlerbehebung bei Benachrichtigungen in Amazon SES — Amazon Web Services
- OWASP API Security Top 10 2023 — OWASP Foundation
- OpenAPI-Vertrag von SendHQ — SendHQ