MailLandDocs
Eingehende E-Mail

Inbound-E-Mail-Übersicht

Eingehende E-Mails über das Inbound-Gateway von Mail.Land empfangen und verarbeiten

Das Inbound-Gateway von MailLand empfängt E-Mails auf Ihren Domains und liefert sie über Webhooks an Ihre Anwendung oder speichert sie zum Abruf. Nutzen Sie die Inbound-Verarbeitung, um Support-Postfächer zu bauen, maschinell erzeugte E-Mails zu parsen oder Antworten an Ihre Anwendung weiterzuleiten.

So funktioniert es

Domain konfigurieren

Richten Sie die MX-Einträge Ihrer Domain auf die Inbound-Server von MailLand. Die Domain benötigt inboundEnabled und einen aktiven Mandanten. MailLand nimmt Mail nur für einen Empfänger an, der einer aktivierten Route entspricht, oder für jede Adresse, wenn catchAllEnabled aktiv ist; alles andere wird bei RCPT abgelehnt.

Routing-Regeln erstellen

Definieren Sie Routen, die auf den lokalen Teil der Empfängeradresse zugeordnet werden, und weisen Sie eine Aktion zu (weiterleiten, Webhook oder speichern).

Geparste E-Mails empfangen

MailLand verarbeitet die E-Mail (parst Header, Body und Anhänge) und liefert das Ergebnis an Ihren Webhook-Endpunkt oder speichert es zum Abruf über die API.

Inbound-Einstellungen

Die Einstellungen gelten pro Domain, nicht für den gesamten Workspace:

GET https://api.mail.land/v1/transactional/inbound/domains/{domainId}/settings
PUT https://api.mail.land/v1/transactional/inbound/domains/{domainId}/settings

Authentifizieren Sie sich mit Authorization: Bearer <token> oder X-API-Key: <api key>.

Get inbound settings
curl https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Inbound settings response
{
  "isEnabled": true,
  "catchAllEnabled": true,
  "maxMessageSizeBytes": 26214400,
  "retentionDays": 30,
  "dailyLimit": 10000,
  "storeEmails": true
}

Einstellungen aktualisieren:

PUT https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings
Update settings request
{
  "isEnabled": true,
  "catchAllEnabled": true,
  "maxMessageSizeBytes": 26214400,
  "retentionDays": 30,
  "dailyLimit": 10000,
  "storeEmails": true
}
Update inbound settings
curl -X PUT https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "isEnabled": true,
    "catchAllEnabled": true,
    "maxMessageSizeBytes": 26214400,
    "retentionDays": 30,
    "dailyLimit": 10000,
    "storeEmails": true
  }'
FeldTypBeschreibung
isEnabledboolInbound-Verarbeitung für diese Domain aktivieren/deaktivieren
catchAllEnabledboolMail an jeden Empfänger der Domain annehmen, nicht nur an Empfänger mit passender aktivierter Route
maxMessageSizeBytesintMaximal akzeptierte Nachrichtengröße in Bytes für diese Domain, durchgesetzt mit SMTP 552 5.3.4. Die Settings-API akzeptiert Werte bis 50 MiB, aber die Plattform akzeptiert unabhängig von dieser Einstellung nie mehr als 25 MiB
dailyLimitintMaximal akzeptierte eingehende Nachrichten pro Tag für diese Domain
retentionDaysintTage, für die gespeicherte E-Mails aufbewahrt werden. Standard 30, erlaubt 1–90
storeEmailsboolOb die vollständig geparste E-Mail zum späteren Abruf gespeichert wird
routeCountintAnzahl der für diese Domain konfigurierten Routen

Es gibt keinen Virenscan und kein einzelnes workspace-weites webhookUrl/webhookSecret: Webhooks werden pro Route über webhookId angehängt (siehe Routen).

maxMessageSizeBytes, dailyLimit und retentionDays werden durchgesetzt. E-Mails werden an <inboundSubdomain>.<domain> empfangen (dem Host, auf den der MX-Eintrag zeigt) und die Root-Domain empfängt weiterhin ebenfalls. Eine Nachricht, die das maxMessageSizeBytes der Domain überschreitet, wird mit SMTP 552 5.3.4 abgelehnt, und zwar nie über dem Plattformlimit von 25 MiB, selbst wenn ein größerer Wert gesetzt ist (die Settings-API akzeptiert bis zu 50 MiB, aber es werden nie mehr als 25 MiB durchgesetzt). Sobald dailyLimit (Standard 10.000) für den Tag erreicht ist, erhalten Absender ein temporäres 452 4.2.2 und sollen es später erneut versuchen, E-Mails gehen dabei nicht verloren. Gespeicherte Nachrichten werden gelöscht, sobald retentionDays (Standard 30, erlaubt 1–90) abgelaufen ist.

E-Mail-Status

Wird als Zeichenkette zurückgegeben, nicht als Zahl:

StatusBeschreibung
ReceivedE-Mail empfangen, Verarbeitung steht aus
ProcessingWird verarbeitet (Parsen, Spam-Prüfung, Routing)
ProcessedVerarbeitet, zugehörige Aktion abgeschlossen
DeliveredErfolgreich zugestellt (weitergeleitet oder Webhook gesendet)
FailedVerarbeitung fehlgeschlagen
ExpiredAufbewahrungsfrist abgelaufen; E-Mail wurde gelöscht

Es gibt keinen separaten Status Quarantined: Spam ist ein boolesches isSpam-Flag an der E-Mail, unabhängig von status.

Eingehende E-Mails auflisten

GET https://api.mail.land/v1/transactional/inbound/emails
List inbound emails
curl https://api.mail.land/v1/transactional/inbound/emails \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
ParameterTypStandardBeschreibung
cursorstring-Undurchsichtiger Cursor aus dem nextCursor der vorherigen Seite. Für die erste Seite weglassen.
limitint20Einträge pro Seite (max. 100), wird begrenzt statt abgelehnt
domainIdstring-Nach öffentlicher Domain-ID filtern
statusstring-Nach E-Mail-Status filtern (Received, Processing, Processed, Delivered, Failed, Expired)
routeIdstring-Nach zugeordneter Route filtern
isSpambool-Nach Spam-Flag filtern. Die Angabe von isSpam (true oder false) entscheidet die Spam-Dimension selbst und deaktiviert den Standardfilter excludeQuarantined, sodass isSpam=true Spam-Zeilen liefert (weiterhin der Nur-gespeichert-Regel unten unterworfen). isSpam weglassen, um den Posteingangs-Standard beizubehalten, der Spam ausblendet.
fromdatetime-E-Mails, die nach diesem Zeitpunkt empfangen wurden
todatetime-E-Mails, die vor diesem Zeitpunkt empfangen wurden
searchstring-Betreff und Absender durchsuchen (Adresse oder Name); durchsucht nicht den Empfänger
sortBystring-Sortierfeld: subject, from, oder standardmäßig receivedAt
sortDescbooltrueAbsteigend sortieren
excludeQuarantinedbooltrueAls Spam markierte E-Mails aus der Liste ausschließen. Wird ignoriert, wenn isSpam angegeben ist.
includeWebhookOnlyboolfalseE-Mails einschließen, die beim Empfang nicht gespeichert wurden (Nur-Webhook- oder Drop-Routen). Standardmäßig ausgeblendet, sodass ein Mandant mit ausschließlich Nur-Webhook-Routen hier eine leere Liste sieht.

Es gibt keine reine subject-Suche und keinen separaten Absender-/Empfängeradressfilter; from/to sind hier Daten, keine Adressen (verwenden Sie search für einen Text-Treffer bei Absender/Betreff).

Inbound emails list response
{
  "items": [
    {
      "id": "k7m2x9q4p1w8z3",
      "domainId": "k3v9x2m8q1w7z4",
      "domainName": "yourdomain.com",
      "matchedRouteId": "r7k3m9q2p4w8x1",
      "matchedRouteName": "Support inbox",
      "fromAddress": "[email protected]",
      "fromName": "Customer Name",
      "subject": "Need help with my account",
      "textPreview": "Hi, I need help with...",
      "hasHtml": true,
      "hasText": true,
      "attachmentCount": 1,
      "sizeBytes": 45230,
      "status": "Delivered",
      "spfResult": "Pass",
      "dkimResult": "Pass",
      "dmarcResult": "Pass",
      "isSpam": false,
      "spamScore": 1.2,
      "receivedAt": "2026-02-17T14:30:00Z",
      "expiresAt": "2026-03-19T14:30:00Z"
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

Es gibt kein to-Feld im Listeneintrag: Empfänger befinden sich in der Detailantwort unter envelopeRecipients/headerRecipients. status ist eine Zeichenkette, keine Zahl.

E-Mail-Details abrufen

GET https://api.mail.land/v1/transactional/inbound/emails/{id}
Get email details
curl https://api.mail.land/v1/transactional/inbound/emails/{id} \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Liefert die Metadaten, Header, eine Textvorschau und Anhang-Metadaten der geparsten E-Mail, nicht den vollständigen HTML-/Text-Body. Rufen Sie dafür die Rohnachricht ab (siehe unten).

Inbound email detail response
{
  "id": "k7m2x9q4p1w8z3",
  "domainId": "k3v9x2m8q1w7z4",
  "domainName": "yourdomain.com",
  "matchedRouteId": "r7k3m9q2p4w8x1",
  "matchedRouteName": "Support inbox",
  "fromAddress": "[email protected]",
  "fromName": "Customer Name",
  "subject": "Need help with my account",
  "textPreview": "Hi, I need assistance with...",
  "hasHtml": true,
  "hasText": true,
  "attachmentCount": 1,
  "sizeBytes": 45230,
  "status": "Delivered",
  "spfResult": "Pass",
  "dkimResult": "Pass",
  "dmarcResult": "Pass",
  "isSpam": false,
  "spamScore": 1.2,
  "receivedAt": "2026-02-17T14:30:00Z",
  "expiresAt": "2026-03-19T14:30:00Z",
  "envelopeFrom": "[email protected]",
  "replyTo": "[email protected]",
  "messageId": "<[email protected]>",
  "inReplyTo": null,
  "dateHeader": "2026-02-17T14:30:00Z",
  "authResultsHeader": "spf=pass dkim=pass dmarc=pass",
  "spamReason": null,
  "sourceIp": "203.0.113.5",
  "heloHostname": "mail.example.com",
  "processingError": null,
  "processedAt": "2026-02-17T14:30:01Z",
  "envelopeRecipients": [
    { "address": "[email protected]", "localPart": "support", "matchedRouteId": "r7k3m9q2p4w8x1" }
  ],
  "headerRecipients": [
    { "type": "To", "address": "[email protected]", "name": null }
  ],
  "attachments": [
    { "id": "a3k7m2q9p4w1x8", "fileName": "screenshot.png", "contentType": "image/png", "sizeBytes": 34500, "isInline": false, "contentId": null }
  ],
  "webhookAttempts": [
    { "attemptNumber": 1, "status": "Delivered", "webhookUrl": "https://yourapp.com/webhooks/inbound", "httpStatusCode": 200, "errorMessage": null, "durationMs": 145, "attemptedAt": "2026-02-17T14:30:02Z", "nextRetryAt": null }
  ]
}

Authentifizierungsergebnisse

Jede eingehende E-Mail enthält SPF-, DKIM- und DMARC-Prüfergebnisse. Die möglichen Werte unterscheiden sich je Prüfung: headerRecipients[].type ist "To", "Cc" oder "Bcc" (Groß-/Kleinschreibung wie angegeben), und dateHeader ist ein ISO-8601-Zeitstempel, nicht der rohe RFC-2822-Header-String.

spfResultBeschreibung
NoneKein SPF-Eintrag gefunden oder Prüfung nicht durchgeführt
PassAbsender ist autorisiert
FailAbsender ist nicht autorisiert
SoftFailAbsender ist möglicherweise nicht autorisiert
NeutralKeine Aussage zur Autorisierung
TempErrorVorübergehender DNS-Fehler
PermErrorDauerhafter DNS-Fehler
dkimResultBeschreibung
NoneKeine DKIM-Signatur gefunden oder Prüfung nicht durchgeführt
PassSignatur verifiziert
FailSignaturverifikation fehlgeschlagen
TempErrorVorübergehender DNS-Fehler
PermErrorDauerhafter DNS-Fehler
dmarcResultBeschreibung
NoneKeine DMARC-Richtlinie gefunden oder Prüfung nicht durchgeführt
PassAlignment bestanden
FailAlignment fehlgeschlagen
QuarantineRichtlinie empfiehlt Quarantäne
RejectRichtlinie empfiehlt Ablehnung

Rohe E-Mail herunterladen

GET https://api.mail.land/v1/transactional/inbound/emails/{id}/raw
Download raw email
curl https://api.mail.land/v1/transactional/inbound/emails/{id}/raw \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -o email.eml

Liefert die ursprüngliche Roh-E-Mail (RFC-5322-Format) als Datei-Download.

E-Mails löschen

Eine einzelne E-Mail löschen:

DELETE https://api.mail.land/v1/transactional/inbound/emails/{id}
Delete inbound email
curl -X DELETE https://api.mail.land/v1/transactional/inbound/emails/{id} \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

E-Mails im Bulk löschen:

POST https://api.mail.land/v1/transactional/inbound/emails/bulk-delete
Bulk delete request
{
  "ids": ["k7m2x9q4p1w8z3", "p3q8w2x7m9k4z1", "w9k3p7m2q8x4z6"]
}
Bulk delete inbound emails
curl -X POST https://api.mail.land/v1/transactional/inbound/emails/bulk-delete \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "ids": ["k7m2x9q4p1w8z3", "p3q8w2x7m9k4z1", "w9k3p7m2q8x4z6"]
  }'

Es gibt auch POST /v1/transactional/inbound/emails/bulk-mark-spam mit demselben {"ids": [...]}-Body, um dieselbe Gruppe von E-Mails in einem Aufruf als Spam zu markieren.

Quarantäne

E-Mails mit isSpam: true erscheinen hier (es gibt keinen Virenscan und keinen separaten Status Quarantined, Spam ist ein boolesches Flag). Unter Quarantäne stehende E-Mails anzeigen:

GET https://api.mail.land/v1/transactional/inbound/quarantine
List quarantined emails
curl https://api.mail.land/v1/transactional/inbound/quarantine \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Eine E-Mail aus der Quarantäne freigeben:

POST https://api.mail.land/v1/transactional/inbound/quarantine/{id}/release
Release from quarantine
curl -X POST https://api.mail.land/v1/transactional/inbound/quarantine/{id}/release \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Das Freigeben einer E-Mail löscht lediglich deren isSpam-Flag. Es führt das Routing nicht erneut aus und sendet Webhooks nicht erneut. Um den Webhook für eine freigegebene (oder beliebige) E-Mail erneut zuzustellen, rufen Sie POST /v1/transactional/inbound/emails/{id}/replay-webhook auf: dies stellt genau eine dauerhafte Zustellung an den vom Route zugeordneten Webhook in die Warteschlange und gibt 202 Accepted zurück (siehe Inbound Webhooks). Ein optionaler Abfrageparameter ?addToAllowlist=true fügt den Absender bei der Freigabe zusätzlich zur Allowlist hinzu.

Allowlist und Blocklist

Allowlist

E-Mails von Absendern auf der Allowlist umgehen die Spam-Filterung:

GET https://api.mail.land/v1/transactional/inbound/allowlist
Get allowlist
curl https://api.mail.land/v1/transactional/inbound/allowlist \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
POST https://api.mail.land/v1/transactional/inbound/allowlist
Add to allowlist
{
  "pattern": "[email protected]",
  "matchType": "ExactEmail",
  "description": "Trusted partner"
}
Add to allowlist
curl -X POST https://api.mail.land/v1/transactional/inbound/allowlist \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "pattern": "[email protected]",
    "matchType": "ExactEmail",
    "description": "Trusted partner"
  }'

Wird als Zeichenkette zurückgegeben und gesendet, nicht als Zahl:

ÜbereinstimmungstypBeschreibung
ExactEmailGenaue E-Mail-Adresse abgleichen
DomainAlle E-Mails einer Domain abgleichen
WildcardPatternAbgleich per Platzhaltermuster

Blocklist

E-Mails von Absendern auf der Blocklist werden automatisch behandelt:

GET https://api.mail.land/v1/transactional/inbound/blocklist
Get blocklist
curl https://api.mail.land/v1/transactional/inbound/blocklist \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
POST https://api.mail.land/v1/transactional/inbound/blocklist
Add to blocklist
{
  "pattern": "[email protected]",
  "matchType": "ExactEmail",
  "action": "RejectAtSmtp",
  "description": "Known spammer"
}
Add to blocklist
curl -X POST https://api.mail.land/v1/transactional/inbound/blocklist \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "pattern": "[email protected]",
    "matchType": "ExactEmail",
    "action": "RejectAtSmtp",
    "description": "Known spammer"
  }'

Wird als Zeichenkette zurückgegeben und gesendet, nicht als Zahl. Standardaktion ist MarkAsSpam, falls weggelassen:

Blocklist-AktionBeschreibung
RejectAtSmtpAblehnung auf SMTP-Ebene (550-Antwort)
MarkAsSpamAnnehmen, aber als Spam markieren (Standard)
DropE-Mail stillschweigend verwerfen

Aus Allowlist oder Blocklist löschen:

DELETE https://api.mail.land/v1/transactional/inbound/allowlist/{id}
DELETE https://api.mail.land/v1/transactional/inbound/blocklist/{id}
Delete from allowlist or blocklist
# Delete from allowlist
curl -X DELETE https://api.mail.land/v1/transactional/inbound/allowlist/{id} \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

# Delete from blocklist
curl -X DELETE https://api.mail.land/v1/transactional/inbound/blocklist/{id} \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Inbound-Statistiken

GET https://api.mail.land/v1/transactional/inbound/stats
Get inbound stats
curl https://api.mail.land/v1/transactional/inbound/stats \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
ParameterTypBeschreibung
domainIdstringNach öffentlicher Domain-ID filtern
fromdatetimeNach receivedAt filtern, ab diesem Zeitpunkt
todatetimeNach receivedAt filtern, vor Ende dieses Tages
Inbound stats response
{
  "totalEmails": 1500,
  "todayEmails": 42,
  "receivedCount": 1500,
  "processingCount": 5,
  "processedCount": 1345,
  "failedCount": 20,
  "spamCount": 80,
  "webhookFailedCount": 3,
  "storageUsedBytes": 52428800,
  "byDomain": [
    { "domainId": "k3v9x2m8q1w7z4", "domainName": "yourdomain.com", "count": 1500 }
  ],
  "byStatus": { "Received": 5, "Processing": 5, "Processed": 1345, "Delivered": 1300, "Failed": 20, "Expired": 50 },
  "dailyStats": [
    { "date": "2026-02-17", "total": 120, "processed": 115, "spam": 8 }
  ]
}

Es gibt kein spamRate/averageSizeBytes-Feld: die obige Struktur ist vollständig.

Fehlerantworten

StatusCodeBeschreibung
400VALIDATION_FAILEDUngültige Anfrageparameter
403FORBIDDENUnzureichende Berechtigungen
404RESOURCE_NOT_FOUNDE-Mail nicht gefunden

Nächste Schritte

  • Routen: Routing-Regeln für eingehende E-Mails konfigurieren
  • Webhooks: geparste E-Mail-Daten per Webhook empfangen
  • Domains: MX-Einträge für die Inbound-Verarbeitung einrichten

Auf dieser Seite