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}/settingsAuthentifizieren Sie sich mit Authorization: Bearer <token> oder X-API-Key: <api key>.
curl https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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{
"isEnabled": true,
"catchAllEnabled": true,
"maxMessageSizeBytes": 26214400,
"retentionDays": 30,
"dailyLimit": 10000,
"storeEmails": true
}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
}'| Feld | Typ | Beschreibung |
|---|---|---|
isEnabled | bool | Inbound-Verarbeitung für diese Domain aktivieren/deaktivieren |
catchAllEnabled | bool | Mail an jeden Empfänger der Domain annehmen, nicht nur an Empfänger mit passender aktivierter Route |
maxMessageSizeBytes | int | Maximal 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 |
dailyLimit | int | Maximal akzeptierte eingehende Nachrichten pro Tag für diese Domain |
retentionDays | int | Tage, für die gespeicherte E-Mails aufbewahrt werden. Standard 30, erlaubt 1–90 |
storeEmails | bool | Ob die vollständig geparste E-Mail zum späteren Abruf gespeichert wird |
routeCount | int | Anzahl 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:
| Status | Beschreibung |
|---|---|
Received | E-Mail empfangen, Verarbeitung steht aus |
Processing | Wird verarbeitet (Parsen, Spam-Prüfung, Routing) |
Processed | Verarbeitet, zugehörige Aktion abgeschlossen |
Delivered | Erfolgreich zugestellt (weitergeleitet oder Webhook gesendet) |
Failed | Verarbeitung fehlgeschlagen |
Expired | Aufbewahrungsfrist 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/emailscurl https://api.mail.land/v1/transactional/inbound/emails \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
cursor | string | - | Undurchsichtiger Cursor aus dem nextCursor der vorherigen Seite. Für die erste Seite weglassen. |
limit | int | 20 | Einträge pro Seite (max. 100), wird begrenzt statt abgelehnt |
domainId | string | - | Nach öffentlicher Domain-ID filtern |
status | string | - | Nach E-Mail-Status filtern (Received, Processing, Processed, Delivered, Failed, Expired) |
routeId | string | - | Nach zugeordneter Route filtern |
isSpam | bool | - | 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. |
from | datetime | - | E-Mails, die nach diesem Zeitpunkt empfangen wurden |
to | datetime | - | E-Mails, die vor diesem Zeitpunkt empfangen wurden |
search | string | - | Betreff und Absender durchsuchen (Adresse oder Name); durchsucht nicht den Empfänger |
sortBy | string | - | Sortierfeld: subject, from, oder standardmäßig receivedAt |
sortDesc | bool | true | Absteigend sortieren |
excludeQuarantined | bool | true | Als Spam markierte E-Mails aus der Liste ausschließen. Wird ignoriert, wenn isSpam angegeben ist. |
includeWebhookOnly | bool | false | E-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).
{
"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}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).
{
"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.
spfResult | Beschreibung |
|---|---|
None | Kein SPF-Eintrag gefunden oder Prüfung nicht durchgeführt |
Pass | Absender ist autorisiert |
Fail | Absender ist nicht autorisiert |
SoftFail | Absender ist möglicherweise nicht autorisiert |
Neutral | Keine Aussage zur Autorisierung |
TempError | Vorübergehender DNS-Fehler |
PermError | Dauerhafter DNS-Fehler |
dkimResult | Beschreibung |
|---|---|
None | Keine DKIM-Signatur gefunden oder Prüfung nicht durchgeführt |
Pass | Signatur verifiziert |
Fail | Signaturverifikation fehlgeschlagen |
TempError | Vorübergehender DNS-Fehler |
PermError | Dauerhafter DNS-Fehler |
dmarcResult | Beschreibung |
|---|---|
None | Keine DMARC-Richtlinie gefunden oder Prüfung nicht durchgeführt |
Pass | Alignment bestanden |
Fail | Alignment fehlgeschlagen |
Quarantine | Richtlinie empfiehlt Quarantäne |
Reject | Richtlinie empfiehlt Ablehnung |
Rohe E-Mail herunterladen
GET https://api.mail.land/v1/transactional/inbound/emails/{id}/rawcurl https://api.mail.land/v1/transactional/inbound/emails/{id}/raw \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-o email.emlLiefert 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}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{
"ids": ["k7m2x9q4p1w8z3", "p3q8w2x7m9k4z1", "w9k3p7m2q8x4z6"]
}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/quarantinecurl 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}/releasecurl -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/allowlistcurl https://api.mail.land/v1/transactional/inbound/allowlist \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."POST https://api.mail.land/v1/transactional/inbound/allowlist{
"pattern": "[email protected]",
"matchType": "ExactEmail",
"description": "Trusted partner"
}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:
| Übereinstimmungstyp | Beschreibung |
|---|---|
ExactEmail | Genaue E-Mail-Adresse abgleichen |
Domain | Alle E-Mails einer Domain abgleichen |
WildcardPattern | Abgleich per Platzhaltermuster |
Blocklist
E-Mails von Absendern auf der Blocklist werden automatisch behandelt:
GET https://api.mail.land/v1/transactional/inbound/blocklistcurl https://api.mail.land/v1/transactional/inbound/blocklist \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."POST https://api.mail.land/v1/transactional/inbound/blocklist{
"pattern": "[email protected]",
"matchType": "ExactEmail",
"action": "RejectAtSmtp",
"description": "Known spammer"
}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-Aktion | Beschreibung |
|---|---|
RejectAtSmtp | Ablehnung auf SMTP-Ebene (550-Antwort) |
MarkAsSpam | Annehmen, aber als Spam markieren (Standard) |
Drop | E-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
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/statscurl https://api.mail.land/v1/transactional/inbound/stats \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Parameter | Typ | Beschreibung |
|---|---|---|
domainId | string | Nach öffentlicher Domain-ID filtern |
from | datetime | Nach receivedAt filtern, ab diesem Zeitpunkt |
to | datetime | Nach receivedAt filtern, vor Ende dieses Tages |
{
"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
| Status | Code | Beschreibung |
|---|---|---|
400 | VALIDATION_FAILED | Ungültige Anfrageparameter |
403 | FORBIDDEN | Unzureichende Berechtigungen |
404 | RESOURCE_NOT_FOUND | E-Mail nicht gefunden |