Zum Hauptinhalt springen
MailLand

Migrationsleitfaden

Von Amazon SES zu Mail.Land migrieren

Beim Wechsel von SES ersetzen ein API-Schlüssel und signierte Webhooks die AWS-Zugangsdaten, Configuration Sets und Event Destinations. Dieser Leitfaden ordnet jedes gängige SendEmail-Feld zu und nennt, was eine Codeänderung erfordert.

SMTP
# Before (Amazon SES)
SMTP_HOST=email-smtp.eu-central-1.amazonaws.com   # your Region's endpoint
SMTP_PORT=587          # STARTTLS (465 for TLS wrapper)
SMTP_USER=<SES SMTP user name for that Region>
SMTP_PASS=<SES SMTP password for that Region>

# After (Mail.Land)
SMTP_HOST=smtp.mail.land
SMTP_PORT=587          # STARTTLS; 465 is not offered
SMTP_USER=apikey       # any value; Mail.Land ignores it
SMTP_PASS=ml_pet_...   # a Mail.Land key with SMTP enabled

Amazon-SES-Konzepte in Mail.Land

Amazon-SES-Konzepte in Mail.Land
Amazon SESMail.Land
IAM-Benutzer und SigV4-AnfragesignaturAPI-Schlüssel (Zugangsdaten) im Header X-API-Key
SMTP-Zugangsdaten pro AWS-RegionDerselbe API-Schlüssel, als SMTP-Passwort verwendet
Verifizierte Identität (Domain) und eigenes MAIL FROMVerifizierte Domain (SPF, DKIM, DMARC und Return-Path)
Configuration Sets und Event Destinations (SNS, EventBridge, Firehose)Mit HMAC-SHA256 signierte Webhooks direkt an Ihren Endpunkt
Sperrliste auf KontoebeneSperrlisten mit Typ und Geltungsbereich
E-Mail-Vorlagen (Handlebars)Vorlagen mit {{name}}-Platzhaltern
Kontaktlisten und TopicsMailinglisten, Kampagnen und Abmeldeverwaltung (Pro und Max)
SandboxSandbox-Schlüssel (ml_set_, ml_sem_): Mit sandboxBehavior LogOnly werden Anfragen angenommen und protokolliert, aber nie zugestellt

Die passenden API-Schlüssel anlegen

Es gibt keine IAM-Richtlinien zu schreiben. Das Präfix eines Mail.Land-Schlüssels zeigt Modus und Stream; legen Sie pro Anwendung und Stream einen Schlüssel an und beschränken Sie ihn auf die Domains und IP-Adressen, die ihn nutzen.

Die passenden API-Schlüssel anlegen
PräfixWofür er gedacht ist
ml_pet_Produktion, Transaktion: Belege, Passwort-Zurücksetzungen, Benachrichtigungen. Bis zu 5 Empfänger pro Anfrage.
ml_pem_Produktion, Marketing: Newsletter und Massenversand mit send-batch, bis zu 10.000 Empfänger pro Aufruf.
ml_set_Sandbox, Transaktion: Mit sandboxBehavior LogOnly (Standard) werden Anfragen angenommen und protokolliert, aber nie zugestellt. Nutzen Sie ihn für Ihre Integrationstests.

Jeder Schlüssel lässt sich auf API, SMTP oder beides, auf ausgewählte Domains und auf bekannte IP-Adressen beschränken. Ein Schlüssel wird einmal angezeigt; Mail.Land speichert nur einen Hash davon.

Dokumentation zu API-Schlüsseln

SMTP umstellen: Host und Zugangsdaten ändern

SES-SMTP-Zugangsdaten werden über IAM erstellt und sind in jeder AWS-Region anders. Mail.Land verwendet Ihren API-Schlüssel als Passwort und ignoriert den Benutzernamen.

SMTP umstellen: Host und Zugangsdaten ändern
EinstellungAmazon SESMail.Land
Hostemail-smtp.<region>.amazonaws.comsmtp.mail.land
Port25, 587 oder 2587 mit STARTTLS oder 465 und 2465 mit TLS Wrapper587 mit STARTTLS
BenutzernameSMTP-Benutzername für diese RegionBeliebiger Wert, zum Beispiel apikey
PasswortSMTP-Passwort für diese RegionEin Mail.Land-API-Schlüssel mit aktiviertem SMTP (ml_pet_ für Transaktions-E-Mails)

Mail.Land akzeptiert die Anmeldung nur nach STARTTLS, die Ports 465 und 2465 werden nicht angeboten. Wenn Ihre Anwendung TLS Wrapper nutzt, stellen Sie auf 587 mit STARTTLS um. Mail.Land wertet X-SES-*-Header wie X-SES-CONFIGURATION-SET nicht aus, Sie können sie also entfernen. Nachrichten dürfen bis zu 15 MiB groß sein.

Dokumentation zum SMTP-Relay

Den API-Aufruf umstellen

SES-Anfragen werden mit AWS Signature Version 4 signiert, meist über ein AWS-SDK. Mail.Land braucht nur den Header X-API-Key und einen flacheren JSON-Body. Hier sehen Sie dieselbe Nachricht in beiden sowie einen Versand mit Vorlage.

aws sesv2 send-email --region eu-central-1 \
  --from-email-address "[email protected]" \
  --destination '{"ToAddresses":["[email protected]"]}' \
  --reply-to-addresses "[email protected]" \
  --email-tags Name=type,Value=order-shipped \
  --content '{
    "Simple": {
      "Subject": { "Data": "Order 12345 has shipped" },
      "Body": {
        "Text": { "Data": "Your order is on its way." },
        "Html": { "Data": "<p>Your order is on its way.</p>" }
      }
    }
  }'
curl -X POST https://api.mail.land/v1/transactional/send \
  -H "X-API-Key: $MAILLAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": { "email": "[email protected]", "name": "Your Shop" },
    "to": [{
      "email": "[email protected]", "name": "Jane",
      "variables": { "orderNumber": "12345" }
    }],
    "replyTo": "[email protected]",
    "subject": "Order {{orderNumber}} has shipped",
    "textContent": "Your order {{orderNumber}} is on its way.",
    "htmlContent": "<p>Your order {{orderNumber}} is on its way.</p>",
    "tags": ["order-shipped"]
  }'
# MAILLAND_API_KEY=ml_pet_...  (production, transactional)

Feldzuordnung für den Sendeaufruf

Von SES API v2 SendEmail (POST /v2/email/outbound-emails) zu POST /v1/transactional/send.

Feldzuordnung für den Sendeaufruf
Amazon SESMail.LandHinweis
AWS Signature Version 4X-API-Key: <key>Keine Anfragesignatur; senden Sie den Schlüssel über HTTPS.
FromEmailAddressfrom.email, from.nameDie Adresse muss zu einer verifizierten Domain gehören.
Destination.ToAddressesto[].email, to[].nameBis zu 5 Empfänger pro Anfrage mit einem Transaktionsschlüssel; jeder erhält eine eigene Kopie.
Destination.CcAddresses, BccAddressesKeineNicht unterstützt. Senden Sie jedem Empfänger eine eigene Nachricht.
ReplyToAddressesreplyToEin einzelner Adress-String statt einer Liste. Wenn Sie mehrere verwendet haben, behalten Sie eine.
Content.Simple.Subject.DatasubjectErforderlich, außer Sie verwenden eine Vorlage.
Content.Simple.Body.Html.DatahtmlContent
Content.Simple.Body.Text.DatatextContent
Content.Simple.Headers [{ Name, Value }]customHeadersEin Objekt aus Headernamen und -werten statt eines Arrays.
Content.Simple.Attachments[].FileName, ContentType, RawContent, ContentId, ContentDispositionattachments[].fileName, contentType, content, contentId, inlineBase64-Inhalt. Setzen Sie inline: true für ein eingebettetes Bild. Bis zu 10 Anhänge und insgesamt 10 MiB.
Content.Raw.Data (MIME)Nicht in der APISenden Sie fertige MIME-Nachrichten stattdessen über das SMTP-Relay.
Content.Template.TemplateName, TemplateArntemplateIdLegen Sie die Vorlage zuerst in Mail.Land neu an.
Content.Template.TemplateDatavariables, to[].variablesEin JSON-Objekt statt eines JSON-Strings.
EmailTags [{ Name, Value }]tagsEin Array von Strings statt Name-Wert-Paaren.
ConfigurationSetNameKeineWebhooks und Tracking werden in Ihrem Mail.Land-Konto und pro Domain eingestellt.
ConfigurationOverrides.Trackingtracking.opens, tracking.clicksDie eigene Einstellung der Domain zum Öffnungs-Tracking hat Vorrang.
ListManagementOptionsNicht im SendeaufrufMarketing-Abmeldungen werden über Listen und Kampagnen in Mail.Land verwaltet.
Keine EntsprechungscheduledAtPlanen Sie eine Nachricht bis zu 7 Tage im Voraus.
Keine EntsprechungHeader X-Idempotency-KeyInnerhalb der Aufbewahrungsfrist liefert eine Wiederholung mit demselben Schlüssel die ursprüngliche Antwort, statt erneut zu senden.

SES antwortet mit 200 und einer MessageId. Mail.Land antwortet mit 202 Accepted, einer jobId, einer Nachrichten-ID pro angenommenem Empfänger sowie den Listen der angenommenen und abgelehnten Empfänger.

Dokumentation zur REST-API

Domain und DNS-Einträge hinzufügen

Fügen Sie die Domain in Mail.Land hinzu und veröffentlichen Sie die Einträge, die das Dashboard anzeigt. SPF, DKIM und DMARC müssen verifiziert sein, bevor Sie senden können. Das geht, während SES noch sendet.

Domain und DNS-Einträge hinzufügen
EintragNameWertHinweis
SPF (TXT)yourdomain.cominclude:spf.mlnd.netFügen Sie das include zu Ihrem bestehenden SPF-Eintrag hinzu. Eine Domain darf nur einen SPF-Eintrag haben.
DKIM (TXT)mlnd._domainkey.yourdomain.comv=DKIM1; k=rsa; p=...Der Selektor ist mlnd, daher steht der Eintrag neben den DKIM-Einträgen, die SES verwendet.
DMARC (TXT)_dmarc.yourdomain.comv=DMARC1; p=...Erforderlich. Behalten Sie einen einzigen DMARC-Eintrag; ein vorhandener mit Richtlinie genügt.
Return-Path (CNAME)bounce.yourdomain.combounce.mlnd.netAuf DNS only setzen, nicht über einen Proxy. Wenn Ihre eigene MAIL-FROM-Domain bei SES diesen Namen bereits nutzt, behalten Sie sie, bis SES nicht mehr sendet.

Behalten Sie die DNS-Einträge von SES bis zum Abschluss des Umzugs und entfernen Sie sie erst, wenn die letzte Nachricht verschickt ist.

Dokumentation zur DNS-Einrichtung

Zuerst die Sperrliste importieren

Die SES-Sperrliste auf Kontoebene gilt pro AWS-Region. Exportieren Sie sie aus jeder Region, aus der Sie senden, mit ListSuppressedDestinations (aws sesv2 list-suppressed-destinations) und importieren Sie sie mit passendem Typ und Geltungsbereich in Mail.Land, im Dashboard oder mit POST /v1/transactional/suppressions/import.

Zuerst die Sperrliste importieren
Grund oder Quelle bei SESTyp in Mail.LandGeltungsbereich
BOUNCEHardBounceGlobal
COMPLAINTComplaintGlobal
Abmeldungen von Kontaktlisten-TopicsUnsubscribeMarketing; oder List, das nur für Kampagnen an die passende Mail.Land-Mailingliste gilt

SES nimmt nur Hard Bounces in die Liste auf, und Spam-Meldungen von Gmail erreichen sie nicht. Importieren Sie daher auch alle Sperren, die Ihre eigenen Systeme führen. Importieren Sie vor dem ersten Versand über Mail.Land, damit abgemeldete Personen von Anfang an gesperrt bleiben.

Dokumentation zu Sperrlisten

Webhooks auf Mail.Land umstellen

Ersetzen Sie das Configuration Set und seine Event Destination durch einen Mail.Land-Webhook: Fügen Sie Ihren HTTPS-Endpunkt hinzu, wählen Sie die Ereignisse und prüfen Sie den Header X-MLND-Signature mit dem Geheimnis dieses Webhooks. Es gibt kein SNS-Abonnement zu bestätigen.

Webhooks auf Mail.Land umstellen
SES-EreignisMail.Land-EreignisHinweis
SendDerzeit keinemessage.sent ist noch nicht verfügbar; die Antwort 202 bestätigt die Annahme.
Zustellung (Delivery)message.delivered
DeliveryDelaymessage.deferred
Bouncemessage.bounced
Complaintmessage.complained
Subscriptionmessage.unsubscribedWird für die eigene Abmeldung des Empfängers gesendet, nicht für Änderungen, die Sie über die API vornehmen.
RejectKeine
RenderingFailureKeineEin fehlender Vorlagenwert wird bereits beim API-Aufruf mit 422 TEMPLATE_VARIABLE_MISSING abgelehnt.
Öffnung, Klick (Open, Click)Noch nicht verfügbarÖffnungs- und Klick-Ereignisse sind im Katalog aufgeführt, werden heute aber nicht gesendet.

Deduplizieren Sie anhand von event_id, denn eine wiederholte Zustellung trägt dieselbe Ereignis-ID. Ein Status kann später korrigiert werden; verarbeiten Sie daher auch nach einem finalen Ereignis weiter und vergleichen Sie status_version.

Webhook-Ereignisse

Prüfung der Webhook-Signatur

Vorlagen neu anlegen

Legen Sie jede Vorlage im Mail.Land-Dashboard oder über die Vorlagen-API an und senden Sie sie mit templateId und variables. Jeder Platzhalter braucht einen Wert, sonst wird der Versand mit 422 und den fehlenden Namen abgelehnt.

Vorlagen neu anlegen
Amazon SESMail.Land
{{firstName}}{{firstName}}
{{contact.firstName}} (verschachtelt){{firstName}}
{{#each}}, {{#if}} ... {{else}}Keine
Inline-Partials ({{> name}})Keine

Mail.Land-Platzhalter sind schlicht: keine verschachtelten Werte, Bedingungen, Schleifen oder Partials. Übergeben Sie flache Werte und verlagern Sie die Logik in Ihre Anwendung oder führen Sie eine Vorlage pro Variante.

Dokumentation zu Vorlagen

Schrittweise wechseln

  1. Fügen Sie Ihre Absender-Domain in Mail.Land hinzu und verifizieren Sie sie; ergänzen Sie include:spf.mlnd.net in Ihrem bestehenden SPF-Eintrag.
  2. Exportieren Sie die Sperrliste jeder AWS-Region, die Sie nutzen, und importieren Sie sie.
  3. Legen Sie Mail.Land-Schlüssel pro Anwendung und Stream an, beschränkt auf Ihre Domains und IP-Adressen.
  4. Legen Sie Ihre Vorlagen neu an und ersetzen Sie jede Event Destination durch einen Webhook.
  5. Legen Sie einen Sandbox-Schlüssel mit sandboxBehavior LogOnly an und führen Sie Ihre Integrationstests gegen Mail.Land aus, ohne E-Mails zuzustellen.
  6. Senden Sie echte Nachrichten an Adressen, die Sie kontrollieren, und prüfen Sie sie im E-Mail-Log.
  7. Verlagern Sie eine Anwendung oder einen kleinen Teil des Volumens und beobachten Sie Zustellung, Bounces und Beschwerden.
  8. Solange beide Anbieter laufen, halten Sie Abmeldungen in beide Richtungen synchron: Übertragen Sie neue Abmeldungen, Beschwerden und Bounces von SES zu Mail.Land und von Mail.Land zu SES, und synchronisieren Sie ein letztes Mal, bevor Sie das restliche Volumen verlagern.
  9. Prüfen Sie das Warm-up Ihrer Domain: In Free und Pro hat eine neue Domain ein Tageslimit, das stufenweise steigt; Sendungen darüber werden abgelehnt. Planen Sie den Umzug innerhalb dieser Grenzen oder fragen Sie uns nach einem eigenen Zeitplan. Max überspringt das Warm-up.
  10. Verlagern Sie dann den Rest und lassen Sie SES aktiv, bis die letzten Nachrichten verschickt sind.

Mail.Land vs. Amazon SES: der belegte Vergleich

Quellen

Öffentliche Seiten von AWS, die für diesen Leitfaden verwendet wurden.

  1. [1]Amazon SES API v2: SendEmailhttps://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.htmlgeprüft am 4. November 2026
  2. [2]Amazon SES: Verbindung mit einem SMTP-Endpunkthttps://docs.aws.amazon.com/ses/latest/dg/smtp-connect.htmlgeprüft am 4. November 2026
  3. [3]Amazon SES: SMTP-Zugangsdaten erhaltenhttps://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.htmlgeprüft am 4. November 2026
  4. [4]Amazon SES: erweiterte E-Mail-Personalisierunghttps://docs.aws.amazon.com/ses/latest/dg/send-personalized-email-advanced.htmlgeprüft am 4. November 2026
  5. [5]Amazon SES: Event Publishinghttps://docs.aws.amazon.com/ses/latest/dg/monitor-using-event-publishing.htmlgeprüft am 4. November 2026
  6. [6]Amazon SES: Sperrliste auf Kontoebenehttps://docs.aws.amazon.com/ses/latest/dg/sending-email-suppression-list.htmlgeprüft am 4. November 2026

Häufige Fragen

Kann ich während der Tests weiter über SES senden?

Ja. Die Verifizierung einer Domain in Mail.Land hindert SES nicht daran, für sie zu senden. Sie können beide parallel betreiben und das Volumen schrittweise verlagern.

Brauche ich weiterhin ein AWS-SDK?

Nein. Jeder HTTP-Client kann die Mail.Land-API mit dem Header X-API-Key aufrufen, und jede SMTP-Bibliothek funktioniert mit dem Relay.

Wie sende ich Massen-E-Mails, die ich mit SendBulkEmail gesendet habe?

Verwenden Sie POST /v1/transactional/send-batch mit einem Marketingschlüssel (ml_pem_). Es nimmt bis zu 10.000 Empfänger mit jeweils eigenen Variablen an.

Wo läuft Mail.Land?

Bei Mail.Land gibt es keine Regionen zur Auswahl. Die Primärkopie Ihrer Daten liegt in Deutschland; die Anbieter außerhalb der EU stehen auf unserer DSGVO-Seite.

Bereit für den Wechsel von Amazon SES?

Erstellen Sie ein kostenloses Konto und senden Sie noch heute Ihren ersten Test. Wenn Sie Hilfe möchten, beschreiben Sie uns Ihre Einrichtung.