Zum Inhalt springen

Amazon SES

Amazon Simple Email Service (SES) ist die günstigste Möglichkeit, große Mengen an Transaktions-E-Mails zu versenden, und die naheliegende Wahl, wenn Sie ohnehin auf AWS arbeiten. Die Einrichtung ist etwas aufwendiger als bei anderen Anbietern – IAM, Region, Verlassen der Sandbox –, danach läuft SES aber sehr zuverlässig.

Wählen Sie SES, wenn Sie tausende E-Mails pro Monat oder mehr versenden, auf den Preis pro Nachricht achten oder alles in Ihrem eigenen AWS-Konto haben möchten. Wenn Sie so schnell wie möglich starten wollen, sind Postmark, Resend oder Mailgun einfacher. Siehe die Übersicht der E-Mail-Dienste.

  • Ein AWS-Konto mit aktiviertem SES in der Region, aus der Sie senden möchten.
  • Eine verifizierte Identität in dieser Region: am besten eine ganze Domain (SES → Identities → Create identity → Domain), mindestens aber die einzelne Absenderadresse.
  • Production access (Verlassen der Sandbox), bevor Sie an beliebige Empfänger senden – siehe Sandbox & Limits.
  • Ein eigener IAM-Benutzer mit Access Key und nur diesen Berechtigungen:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ses:SendEmail", "ses:SendRawEmail", "ses:GetAccount"],
"Resource": "*"
}
]
}

ses:SendEmail / ses:SendRawEmail werden zum Senden benötigt (Frontmail nutzt die SES-v2-API mit einer Raw-MIME-Nachricht), ses:GetAccount für Verbindung testen und die tägliche Statusprüfung, die auch Ihr Kontingent und den Sandbox-Status ausliest. Sie können Resource auf die ARNs Ihrer Identität und Ihres Configuration Sets einschränken. Verwenden Sie keine Root-Zugangsdaten und keinen Admin-Benutzer.

  1. Öffnen Sie E-Mail-Dienste → Dienst hinzufügen → Amazon SES.
  2. Füllen Sie die Felder aus:
Feld Wo Sie es finden Beispiel
AWS-Region Die Region, in der Ihre Identität verifiziert ist (oben rechts in der SES-Konsole) eu-central-1
Access key ID IAM → Users → frontmail-ses → Security credentials → Create access key AKIAIOSFODNN7EXAMPLE
Secret access key Wird einmalig beim Erstellen des Access Keys angezeigt wJalrXUtnFEMI/K7MDENG/…
Configuration set SES → Configuration sets (für Zustellereignisse erforderlich) frontmail
SNS-Topic-ARN Optional; SNS → Topics – Ereignisse aus anderen Topics werden dann ignoriert arn:aws:sns:eu-central-1:123456789012:frontmail-events
Standard-Absenderadresse Optional; eine verifizierte Identität in der gewählten Region (eine Adresse auf einer verifizierten Domain oder eine verifizierte Adresse). Wird verwendet, wenn die Vorlage keinen Absender hat hello@example.com
Standard-Absendername Optional; Anzeigename für den Standardabsender Acme
Max. E-Mails pro Sekunde Optional; höchstens Ihre maximale SES-Senderate 14
  1. Klicken Sie auf Prüfen & speichern. Frontmail ruft GetAccount auf und zeigt an, ob sich das Konto noch in der Sandbox befindet, sowie die maximale Senderate und das 24-Stunden-Kontingent.
  2. Ist die Prüfung erfolgreich, wird der Dienst gespeichert. SES kennt keine „Kontoadresse“ – legen Sie hier also eine Standard-Absenderadresse fest oder in jeder Vorlage einen Absender, sonst schlägt der Versand mit sender_not_configured fehl (siehe Standardabsender). Sie können sie später auf der Seite des Dienstes ohne erneute Prüfung ändern.
  3. Der Access Key wird mit AWS KMS per Envelope-Verschlüsselung verschlüsselt; entschlüsselt wird er nur im Versandprozess.

Easy DKIM – wenn Sie eine Domain-Identität anlegen, gibt Ihnen SES drei CNAME-Einträge:

abcdef1234._domainkey.example.com. CNAME abcdef1234.dkim.amazonses.com.
ghijkl5678._domainkey.example.com. CNAME ghijkl5678.dkim.amazonses.com.
mnopqr9012._domainkey.example.com. CNAME mnopqr9012.dkim.amazonses.com.

AWS rotiert die dahinterliegenden Schlüssel automatisch. Sobald die Einträge auflösbar sind, zeigt die Identität Verified an.

SPF über eine eigene MAIL-FROM-Domain – standardmäßig ist der Envelope-Absender eine amazonses.com-Adresse; SPF besteht dann zwar, ist aber nicht an Ihre Domain ausgerichtet. Damit auch SPF für DMARC ausgerichtet ist, legen Sie an der Identität eine eigene MAIL FROM fest (z. B. bounce.example.com) und veröffentlichen:

bounce.example.com. MX 10 feedback-smtp.eu-central-1.amazonses.com.
bounce.example.com. TXT "v=spf1 include:amazonses.com ~all"

(Ersetzen Sie eu-central-1 durch Ihre Region.)

DMARC – beginnen Sie im Überwachungsmodus und verschärfen Sie dann:

_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"

SES ist regional: Identitäten, Sandbox-Status, Kontingente, Configuration Sets und Suppression Lists gelten jeweils pro Region. Die Region, die Sie in Frontmail wählen, muss diejenige sein,

  • in der Ihre Domain oder Adresse verifiziert ist,
  • in der Sie Production Access beantragt haben,
  • in der Ihr Configuration Set und Ihr SNS-Topic liegen.

Der IAM-Access-Key selbst gilt global; in einer Region, in der nichts eingerichtet ist, schlägt er aber mit „Email address is not verified“ fehl. Für eine Datenhaltung in der EU wählen Sie eine EU-Region wie eu-central-1 (Frankfurt), eu-west-1 (Irland) oder eu-north-1 (Stockholm).

Jedes neue SES-Konto startet in jeder Region in der Sandbox:

  • Sie können nur an verifizierte Adressen oder Domains senden,
  • höchstens 200 Nachrichten pro 24 Stunden,
  • höchstens 1 Nachricht pro Sekunde.

Beantragen Sie Production Access unter SES → Account dashboard → Request production access. Beschreiben Sie den Anwendungsfall (Transaktions-E-Mails aus einem Webformular über Frontmail), wie Empfänger eingewilligt haben und wie Sie mit Bounces und Beschwerden umgehen. Die Freigabe dauert in der Regel etwa einen Tag.

Nach der Freigabe startet Ihr Kontingent auf einem moderaten Niveau (z. B. 50.000/Tag, 14/s) und wächst mit einer guten Versandhistorie. Die aktuellen Werte zeigt Verbindung testen an; setzen Sie Max. E-Mails pro Sekunde auf höchstens Ihre maximale Senderate.

SES veröffentlicht Ereignisse über Amazon SNS. Frontmail abonniert Ihr SNS-Topic per HTTPS.

  1. SNS → Topics → Create topic (Standard), z. B. frontmail-events, in derselben Region.

  2. Create subscription → Protokoll HTTPS → Endpoint = die Webhook-URL von der Seite des Dienstes in Frontmail (Kopier-Schaltfläche):

    https://api.frontmail.dev/webhooks/providers/ses/<token>

    Lassen Sie raw message delivery ausgeschaltet. Frontmail prüft die SNS-Signatur und bestätigt das Abonnement automatisch – innerhalb weniger Sekunden wechselt der Status des Abonnements von Pending confirmation zu Confirmed.

  3. SES → Configuration sets → Create set (z. B. frontmail) → Event destinations → Add destination → Ereignistypen auswählen → Ziel Amazon SNS → Ihr Topic.

  4. Tragen Sie den Namen des Configuration Sets (und optional die Topic-ARN) im Frontmail-Dienst ein und speichern Sie.

SES-Ereignistyp Frontmail-Ereignis
Deliveries delivered
Hard Bounces (Permanent) bounced – wird auf die Sperrliste gesetzt
Soft Bounces (Transient), Zustellverzögerungen wird bei der Nachricht protokolliert
Complaints complained – wird auf die Sperrliste gesetzt
Opens opened
Clicks clicked
Rejects, Rendering-Fehler wird bei der Nachricht protokolliert

Signaturprüfung: Jede SNS-Nachricht ist signiert. Frontmail lädt das Signaturzertifikat nur von sns.<region>.amazonaws.com, prüft die Signatur (SignatureVersion 1 oder 2) und lehnt Nachrichten ab, die älter als eine Stunde sind. Wenn Sie SNS-Topic-ARN festlegen, werden Benachrichtigungen aus allen anderen Topics abgelehnt. Lassen Sie das Feld leer, merkt sich Frontmail das Topic der ersten gültig signierten Nachricht (normalerweise die Bestätigung des Abonnements) und lehnt danach Nachrichten aus jedem anderen Topic ab – eine SNS-Signatur beweist nur, dass irgendein AWS-Konto die Nachricht gesendet hat.

Frontmail fügt jeder E-Mail den Message Tag frontmail_message_id hinzu, damit Ereignisse der Nachricht zugeordnet werden können.

  • auth – der Dienst funktioniert nicht (ungültiger/gelöschter Access Key, fehlende IAM-Berechtigung, Versand pausiert, Absender nicht verifiziert). Der Dienst wird als unhealthy markiert; der Inhaber erhält eine E-Mail und einen Hinweis im Dashboard. Hat die Vorlage einen Ersatzdienst, geht die Nachricht darüber; sonst wird der Credit erstattet und die Nachricht wartet als held_service_error in der Warteschlange zurückgehaltener E-Mails, bis Sie den Dienst reparieren (geprüft beim Speichern und bei der täglichen Statusprüfung) – dann wird sie automatisch gesendet.
  • permanent – diese Nachricht lässt sich nicht senden (ungültiger oder nicht verifizierter Empfänger, abgelehnter Inhalt). Ersatzdienst, falls eingerichtet, sonst failed mit Erstattung des Credits.
  • transient – Drosselung, Timeouts, 5xx. Wiederholung mit exponentiellem Backoff; nach dem letzten Versuch failed und Erstattung des Credits.
SES-Fehler Klasse Was tun
InvalidClientTokenId / UnrecognizedClientException / SignatureDoesNotMatch auth Access Key ID oder Secret sind falsch oder gelöscht. Erstellen Sie einen neuen Schlüssel für den IAM-Benutzer.
AccessDeniedException: … not authorized to perform ses:SendRawEmail auth Ergänzen Sie die fehlende Aktion in der IAM-Richtlinie (siehe oben).
MessageRejected: Email address is not verified … hello@example.com (der Absender) auth Verifizieren Sie die Domain oder die Absenderadresse in der gewählten Region.
MailFromDomainNotVerifiedException auth Korrigieren Sie die MX-/TXT-Einträge der eigenen MAIL FROM oder entfernen Sie die eigene MAIL FROM.
SendingPausedException / AccountSuspendedException auth AWS hat den Versand pausiert (oft wegen hoher Bounce- oder Beschwerderate). Prüfen Sie SES → Reputation metrics und die Hinweise von AWS.
MessageRejected: Email address is not verified … customer@gmail.com (ein Empfänger) permanent Das Konto ist noch in der Sandbox – beantragen Sie Production Access oder verifizieren Sie den Empfänger.
BadRequestException / ValidationException (ungültige Adresse) permanent Siehe ungültiger Empfänger.
TooManyRequestsException / Throttling: Maximum sending rate exceeded transient Senken Sie Max. E-Mails pro Sekunde auf Ihre SES-Senderate; beantragen Sie bei AWS ein höheres Kontingent.
InternalFailure, ServiceUnavailable, Timeouts transient Nichts zu tun – Frontmail wiederholt automatisch.
  • Domain-Identität mit Easy DKIM (3 CNAMEs) in der gewählten Region verifiziert
  • Eigene MAIL FROM (MX + SPF) und DMARC p=none veröffentlicht
  • Production Access in dieser Region erteilt
  • IAM-Benutzer nur mit ses:SendEmail, ses:SendRawEmail, ses:GetAccount
  • Verbindung testen erfolgreich und zeigt sandbox: false
  • Configuration Set → SNS-Topic → HTTPS-Abonnement auf die Frontmail-Webhook-URL, Status Confirmed
  • Name des Configuration Sets in Frontmail eingetragen
  • Max. E-Mails pro Sekunde höchstens bei Ihrer SES-Senderate