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}/settingsAuthentifiez-vous avec Authorization: Bearer <token> ou 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
}Mettre à jour les paramètres :
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
}'| Champ | Type | Description |
|---|---|---|
isEnabled | bool | Activer/désactiver le traitement entrant pour ce domaine |
catchAllEnabled | bool | Accepter le courrier pour n'importe quel destinataire du domaine, pas seulement ceux correspondant à une route activée |
maxMessageSizeBytes | int | Taille 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 |
dailyLimit | int | Nombre maximal de messages entrants acceptés par jour pour ce domaine |
retentionDays | int | Nombre de jours de conservation des e-mails stockés. Par défaut 30, valeurs autorisées 1–90 |
storeEmails | bool | Indique si l'e-mail analysé complet est stocké pour une récupération ultérieure |
routeCount | int | Nombre 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 :
| Statut | Description |
|---|---|
Received | E-mail reçu, en attente de traitement |
Processing | En cours de traitement (analyse, vérification anti-spam, routage) |
Processed | Traité et son action terminée |
Delivered | Livré avec succès (transféré ou webhook envoyé) |
Failed | Échec du traitement |
Expired | Pé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/emailscurl https://api.mail.land/v1/transactional/inbound/emails \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
cursor | string | - | Curseur opaque provenant du nextCursor de la page précédente. À omettre pour la première page. |
limit | int | 20 | Éléments par page (max. 100), plafonné plutôt que rejeté |
domainId | string | - | Filtrer par ID publique du domaine |
status | string | - | Filtrer par statut de l'e-mail (Received, Processing, Processed, Delivered, Failed, Expired) |
routeId | string | - | Filtrer par route correspondante |
isSpam | bool | - | 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. |
from | datetime | - | E-mails reçus après cette heure |
to | datetime | - | E-mails reçus avant cette heure |
search | string | - | Recherche sur l'objet et l'expéditeur (adresse ou nom) ; ne correspond pas au destinataire |
sortBy | string | - | Champ de tri : subject, from, ou par défaut receivedAt |
sortDesc | bool | true | Tri décroissant |
excludeQuarantined | bool | true | Exclure de la liste les e-mails marqués comme spam. Ignoré si isSpam est indiqué. |
includeWebhookOnly | bool | false | Inclure 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).
{
"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}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).
{
"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.
spfResult | Description |
|---|---|
None | Aucun enregistrement SPF trouvé ou vérification non effectuée |
Pass | L'expéditeur est autorisé |
Fail | L'expéditeur n'est pas autorisé |
SoftFail | L'expéditeur pourrait ne pas être autorisé |
Neutral | Aucune déclaration sur l'autorisation |
TempError | Erreur DNS temporaire |
PermError | Erreur DNS permanente |
dkimResult | Description |
|---|---|
None | Aucune signature DKIM trouvée ou vérification non effectuée |
Pass | Signature vérifiée |
Fail | Échec de la vérification de la signature |
TempError | Erreur DNS temporaire |
PermError | Erreur DNS permanente |
dmarcResult | Description |
|---|---|
None | Aucune politique DMARC trouvée ou vérification non effectuée |
Pass | Alignement réussi |
Fail | Échec de l'alignement |
Quarantine | La politique recommande la mise en quarantaine |
Reject | La politique recommande le rejet |
Télécharger l'e-mail brut
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.emlRenvoie 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}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{
"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"]
}'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/quarantinecurl 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}/releasecurl -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/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"
}'Renvoyé et envoyé sous forme de chaîne de caractères, pas de nombre :
| Type de correspondance | Description |
|---|---|
ExactEmail | Correspond à une adresse e-mail exacte |
Domain | Correspond à tous les e-mails d'un domaine |
WildcardPattern | Correspondance 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/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"
}'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 blocage | Description |
|---|---|
RejectAtSmtp | Rejeter au niveau SMTP (réponse 550) |
MarkAsSpam | Accepter mais marquer comme spam (par défaut) |
Drop | Abandonner 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
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/statscurl https://api.mail.land/v1/transactional/inbound/stats \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Paramètre | Type | Description |
|---|---|---|
domainId | string | Filtrer par ID publique du domaine |
from | datetime | Filtrer par receivedAt à partir de cette heure |
to | datetime | Filtrer par receivedAt avant la fin de ce jour |
{
"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
| Statut | Code | Description |
|---|---|---|
400 | VALIDATION_FAILED | Paramètres de requête invalides |
403 | FORBIDDEN | Permissions insuffisantes |
404 | RESOURCE_NOT_FOUND | E-mail introuvable |