MailLandDocs
Email entrant

Aperçu des e-mails entrants

Recevez et traitez les e-mails entrants avec la passerelle entrante de Mail.Land

La passerelle entrante de MailLand reçoit les e-mails sur vos domaines et les transmet à votre application via des webhooks, ou les stocke pour récupération. Utilisez le traitement entrant pour créer des boîtes de support, analyser des e-mails générés automatiquement ou acheminer des réponses vers votre application.

Fonctionnement

Configurez votre domaine

Pointez les enregistrements MX de votre domaine vers les serveurs entrants de MailLand. Le domaine a besoin de inboundEnabled et d'un tenant actif. MailLand n'accepte le courrier que pour un destinataire correspondant à une route activée, ou pour toute adresse si catchAllEnabled est actif ; tout le reste est refusé au niveau de RCPT.

Créez des règles de routage

Définissez des routes qui correspondent à la partie locale de l'adresse du destinataire, et attribuez-leur une action (transfert, webhook ou stockage).

Recevez des e-mails analysés

MailLand traite l'e-mail (analyse les en-têtes, le corps et les pièces jointes) et livre le résultat à votre point de terminaison webhook ou le stocke pour récupération via l'API.

Paramètres entrants

Les paramètres sont définis par domaine, et non à l'échelle de tout l'espace de travail :

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

Authentifiez-vous avec Authorization: Bearer <token> ou 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
}

Mettre à jour les paramètres :

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
  }'
ChampTypeDescription
isEnabledboolActiver/désactiver le traitement entrant pour ce domaine
catchAllEnabledboolAccepter le courrier pour n'importe quel destinataire du domaine, pas seulement ceux correspondant à une route activée
maxMessageSizeBytesintTaille de message maximale acceptée en octets pour ce domaine, appliquée avec SMTP 552 5.3.4. L'API des paramètres accepte jusqu'à 50 Mio, mais la plateforme n'accepte jamais plus de 25 Mio, quel que soit ce réglage
dailyLimitintNombre maximal de messages entrants acceptés par jour pour ce domaine
retentionDaysintNombre de jours de conservation des e-mails stockés. Par défaut 30, valeurs autorisées 1–90
storeEmailsboolIndique si l'e-mail analysé complet est stocké pour une récupération ultérieure
routeCountintNombre de routes configurées pour ce domaine

Il n'y a pas d'analyse antivirus, ni de webhookUrl/webhookSecret unique à l'échelle de l'espace de travail ; les webhooks sont rattachés par route via webhookId (voir Routes).

maxMessageSizeBytes, dailyLimit et retentionDays sont appliqués. Le courrier est reçu sur <inboundSubdomain>.<domain>, l'hôte vers lequel pointe l'enregistrement MX, et le domaine racine continue également de recevoir. Un message dépassant le maxMessageSizeBytes du domaine est refusé avec le code SMTP 552 5.3.4, et jamais au-delà de la limite de la plateforme de 25 Mio même si une valeur supérieure est configurée (l'API des paramètres accepte jusqu'à 50 Mio, mais seuls 25 Mio sont appliqués). Une fois le dailyLimit (10 000 par défaut) atteint pour la journée, les expéditeurs reçoivent un 452 4.2.2 temporaire et doivent réessayer plus tard ; le courrier n'est pas perdu. Les messages stockés sont supprimés une fois retentionDays (30 par défaut, 1 à 90 autorisé) écoulé.

Statuts des e-mails

Renvoyé sous forme de chaîne de caractères, pas de nombre :

StatutDescription
ReceivedE-mail reçu, en attente de traitement
ProcessingEn cours de traitement (analyse, vérification anti-spam, routage)
ProcessedTraité et son action terminée
DeliveredLivré avec succès (transféré ou webhook envoyé)
FailedÉchec du traitement
ExpiredPériode de rétention écoulée ; l'e-mail a été supprimé

Il n'existe pas de statut Quarantined distinct : le spam est un indicateur booléen isSpam sur l'e-mail, indépendant de status.

Lister les e-mails entrants

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..."
ParamètreTypePar défautDescription
cursorstring-Curseur opaque provenant du nextCursor de la page précédente. À omettre pour la première page.
limitint20Éléments par page (max. 100), plafonné plutôt que rejeté
domainIdstring-Filtrer par ID publique du domaine
statusstring-Filtrer par statut de l'e-mail (Received, Processing, Processed, Delivered, Failed, Expired)
routeIdstring-Filtrer par route correspondante
isSpambool-Filtrer par indicateur de spam. Indiquer isSpam (true ou false) décide la dimension spam à lui seul et désactive le filtre par défaut excludeQuarantined, donc isSpam=true renvoie les lignes de spam (toujours soumises à la règle « stocké uniquement » ci-dessous). Omettez isSpam pour conserver le comportement par défaut de la boîte de réception, qui masque le spam.
fromdatetime-E-mails reçus après cette heure
todatetime-E-mails reçus avant cette heure
searchstring-Recherche sur l'objet et l'expéditeur (adresse ou nom) ; ne correspond pas au destinataire
sortBystring-Champ de tri : subject, from, ou par défaut receivedAt
sortDescbooltrueTri décroissant
excludeQuarantinedbooltrueExclure de la liste les e-mails marqués comme spam. Ignoré si isSpam est indiqué.
includeWebhookOnlyboolfalseInclure les e-mails qui n'ont pas été stockés à la réception (routes webhook uniquement ou de suppression). Masqués par défaut, un locataire dont toutes les routes sont webhook uniquement verra donc une liste vide ici.

Il n'existe pas de recherche uniquement par subject, ni de filtre d'adresse expéditeur/destinataire à lui seul, et from/to sont ici des dates, pas des adresses (utilisez search pour une correspondance textuelle sur l'expéditeur/objet).

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
}

Il n'y a pas de champ to sur l'élément de liste : les destinataires se trouvent dans la réponse de détail sous envelopeRecipients/headerRecipients. status est une chaîne de caractères, pas un nombre.

Obtenir les détails d'un e-mail

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..."

Renvoie les métadonnées de l'e-mail analysé, les en-têtes, un aperçu texte et les métadonnées des pièces jointes, pas le corps HTML/texte complet. Récupérez le message brut pour cela (voir ci-dessous).

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 }
  ]
}

Résultats d'authentification

Chaque e-mail entrant inclut les résultats de vérification SPF, DKIM et DMARC. Les valeurs possibles diffèrent selon le contrôle : headerRecipients[].type vaut "To", "Cc" ou "Bcc" (cette casse exacte), et dateHeader est un horodatage ISO 8601, pas la chaîne brute de l'en-tête RFC 2822.

spfResultDescription
NoneAucun enregistrement SPF trouvé ou vérification non effectuée
PassL'expéditeur est autorisé
FailL'expéditeur n'est pas autorisé
SoftFailL'expéditeur pourrait ne pas être autorisé
NeutralAucune déclaration sur l'autorisation
TempErrorErreur DNS temporaire
PermErrorErreur DNS permanente
dkimResultDescription
NoneAucune signature DKIM trouvée ou vérification non effectuée
PassSignature vérifiée
FailÉchec de la vérification de la signature
TempErrorErreur DNS temporaire
PermErrorErreur DNS permanente
dmarcResultDescription
NoneAucune politique DMARC trouvée ou vérification non effectuée
PassAlignement réussi
FailÉchec de l'alignement
QuarantineLa politique recommande la mise en quarantaine
RejectLa politique recommande le rejet

Télécharger l'e-mail brut

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

Renvoie l'e-mail brut original (format RFC 5322) sous forme de fichier téléchargeable.

Supprimer des e-mails

Supprimer un seul e-mail :

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..."

Suppression groupée d'e-mails :

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"]
  }'

Il existe aussi POST /v1/transactional/inbound/emails/bulk-mark-spam, avec le même corps {"ids": [...]}, pour marquer comme spam le même lot d'e-mails en un seul appel.

Quarantaine

Les e-mails avec isSpam: true apparaissent ici (il n'y a pas d'analyse antivirus ni de statut Quarantined distinct : le spam est un simple indicateur booléen). Afficher les e-mails en quarantaine :

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..."

Libérer un e-mail de la quarantaine :

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..."

Libérer un e-mail se contente d'effacer son indicateur isSpam. Cela ne relance pas le routage et ne renvoie pas les webhooks. Pour redélivrer le webhook d'un e-mail libéré (ou de n'importe quel autre), appelez POST /v1/transactional/inbound/emails/{id}/replay-webhook : cela met en file une seule livraison durable vers le webhook de la route correspondante et retourne 202 Accepted (voir Inbound Webhooks). Un paramètre de requête optionnel ?addToAllowlist=true ajoute également l'expéditeur à la liste blanche au moment de la libération.

Liste blanche et liste noire

Liste blanche

Les e-mails des expéditeurs en liste blanche contournent le filtrage anti-spam :

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"
  }'

Renvoyé et envoyé sous forme de chaîne de caractères, pas de nombre :

Type de correspondanceDescription
ExactEmailCorrespond à une adresse e-mail exacte
DomainCorrespond à tous les e-mails d'un domaine
WildcardPatternCorrespondance par motif générique

Liste noire

Les e-mails des expéditeurs en liste noire sont traités automatiquement :

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"
  }'

Renvoyé et envoyé sous forme de chaîne de caractères, pas de nombre. L'action par défaut est MarkAsSpam si omise :

Action de blocageDescription
RejectAtSmtpRejeter au niveau SMTP (réponse 550)
MarkAsSpamAccepter mais marquer comme spam (par défaut)
DropAbandonner silencieusement l'e-mail

Supprimer de la liste blanche ou de la liste noire :

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..."

Statistiques entrantes

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..."
ParamètreTypeDescription
domainIdstringFiltrer par ID publique du domaine
fromdatetimeFiltrer par receivedAt à partir de cette heure
todatetimeFiltrer par receivedAt avant la fin de ce jour
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 }
  ]
}

Il n'y a pas de champ spamRate/averageSizeBytes, la structure ci-dessus est exhaustive.

Réponses d'erreur

StatutCodeDescription
400VALIDATION_FAILEDParamètres de requête invalides
403FORBIDDENPermissions insuffisantes
404RESOURCE_NOT_FOUNDE-mail introuvable

Étapes suivantes

  • Routes : configurez les règles de routage pour les e-mails entrants
  • Webhooks : recevez les données d'e-mail analysées via webhook
  • Domaines : configurez les enregistrements MX pour le traitement entrant

Sur cette page