Resumen de correo de entrada
Reciba y procese correos entrantes con la puerta de enlace de entrada de Mail.Land
La puerta de enlace de entrada de MailLand recibe correos en sus dominios y los entrega a su aplicación mediante webhooks o los almacena para su recuperación. Use el procesamiento de entrada para crear bandejas de soporte, analizar correos generados por máquinas o enrutar respuestas a su aplicación.
Cómo funciona
Configure su dominio
Apunte los registros MX de su dominio a los servidores de entrada de MailLand. El dominio necesita inboundEnabled y un tenant activo. MailLand acepta correo solo para un destinatario que coincida con una ruta habilitada, o para cualquier dirección si catchAllEnabled está activo; cualquier otro caso se rechaza en RCPT.
Cree reglas de enrutamiento
Defina rutas que coincidan con la parte local de la dirección del destinatario, y asígneles una acción (reenviar, webhook o almacenar).
Reciba correos analizados
MailLand procesa el correo (analiza encabezados, cuerpo y adjuntos) y entrega el resultado a su endpoint de webhook o lo almacena para recuperarlo mediante la API.
Configuración de entrada
La configuración es por dominio, no a nivel de todo el espacio de trabajo:
GET https://api.mail.land/v1/transactional/inbound/domains/{domainId}/settings
PUT https://api.mail.land/v1/transactional/inbound/domains/{domainId}/settingsAutentíquese con Authorization: Bearer <token> o 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
}Actualizar configuración:
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
}'| Campo | Tipo | Descripción |
|---|---|---|
isEnabled | bool | Activar/desactivar el procesamiento de entrada para este dominio |
catchAllEnabled | bool | Aceptar correo para cualquier destinatario del dominio, no solo los que coinciden con una ruta habilitada |
maxMessageSizeBytes | int | Tamaño máximo de mensaje aceptado en bytes para este dominio, aplicado con SMTP 552 5.3.4. La API de configuración acepta hasta 50 MiB, pero la plataforma nunca acepta más de 25 MiB, sin importar este ajuste |
dailyLimit | int | Máximo de mensajes de entrada aceptados por día para este dominio |
retentionDays | int | Días que se conservan los correos almacenados. Predeterminado 30, permitido 1–90 |
storeEmails | bool | Si se almacena el correo analizado completo para su recuperación posterior |
routeCount | int | Número de rutas configuradas para este dominio |
No hay análisis antivirus, ni un único webhookUrl/webhookSecret a nivel de espacio de trabajo; los webhooks se asocian por ruta mediante webhookId (vea Rutas).
maxMessageSizeBytes, dailyLimit y retentionDays se aplican. El correo se recibe en <inboundSubdomain>.<domain>, el host al que apunta el registro MX, y el dominio raíz también sigue recibiendo. Un mensaje que supere el maxMessageSizeBytes del dominio se rechaza con SMTP 552 5.3.4, y nunca por encima del límite de la plataforma de 25 MiB aunque se configure un valor mayor (la API de configuración acepta hasta 50 MiB, pero solo se aplican 25 MiB). Una vez alcanzado el dailyLimit (10.000 por defecto) del día, los remitentes reciben un 452 4.2.2 temporal y deben reintentar más tarde; el correo no se pierde. Los mensajes almacenados se eliminan al cumplirse retentionDays (30 por defecto, permitido 1–90).
Estados del correo
Se devuelven como cadenas de texto, no como números:
| Estado | Descripción |
|---|---|
Received | Correo recibido, pendiente de procesamiento |
Processing | En proceso (análisis, verificación de spam, enrutamiento) |
Processed | Procesado y su acción completada |
Delivered | Entregado con éxito (reenviado o webhook enviado) |
Failed | Error en el procesamiento |
Expired | Período de retención vencido; el correo fue eliminado |
No existe un estado Quarantined independiente; el spam es un indicador booleano isSpam en el correo, independiente de status.
Listar correos de entrada
GET https://api.mail.land/v1/transactional/inbound/emailscurl https://api.mail.land/v1/transactional/inbound/emails \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
cursor | string | - | Cursor opaco proveniente del nextCursor de la página anterior. Omítalo para la primera página. |
limit | int | 20 | Elementos por página (máx. 100), se limita en vez de rechazarse |
domainId | string | - | Filtrar por ID pública del dominio |
status | string | - | Filtrar por estado del correo (Received, Processing, Processed, Delivered, Failed, Expired) |
routeId | string | - | Filtrar por ruta coincidente |
isSpam | bool | - | Filtrar por indicador de spam. Indicar isSpam (true o false) decide la dimensión de spam por sí solo y desactiva el filtro predeterminado excludeQuarantined, por lo que isSpam=true devuelve las filas de spam (aún sujetas a la regla de solo-almacenados de abajo). Omita isSpam para conservar el comportamiento predeterminado de la bandeja de entrada, que oculta el spam. |
from | datetime | - | Correos recibidos después de esta hora |
to | datetime | - | Correos recibidos antes de esta hora |
search | string | - | Busca en el asunto y el remitente (dirección o nombre); no coincide con el destinatario |
sortBy | string | - | Campo de ordenación: subject, from, o el predeterminado receivedAt |
sortDesc | bool | true | Ordenar de forma descendente |
excludeQuarantined | bool | true | Excluir de la lista los correos marcados como spam. Se ignora si se indica isSpam. |
includeWebhookOnly | bool | false | Incluir correos que no se almacenaron al recibirse (rutas solo webhook o de descarte). Por defecto están ocultos, por lo que un inquilino cuyas rutas son todas solo webhook verá una lista vacía aquí. |
No existe una búsqueda solo por subject, ni un filtro de dirección de remitente/destinatario por sí solo, y from/to aquí son fechas, no direcciones (use search para una coincidencia de texto de remitente/asunto).
{
"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
}No hay campo to en el elemento de la lista; los destinatarios están en la respuesta de detalle bajo envelopeRecipients/headerRecipients. status es una cadena de texto, no un número.
Obtener detalles del correo
GET https://api.mail.land/v1/transactional/inbound/emails/{id}curl https://api.mail.land/v1/transactional/inbound/emails/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Devuelve los metadatos del correo analizado, los encabezados, una vista previa de texto y los metadatos de los adjuntos, no el cuerpo HTML/texto completo. Obtenga el mensaje sin procesar para eso (vea abajo).
{
"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 }
]
}Resultados de autenticación
Cada correo de entrada incluye los resultados de verificación de SPF, DKIM y DMARC. Los valores
posibles difieren por comprobación: headerRecipients[].type es "To", "Cc" o "Bcc" (con esa
capitalización), y dateHeader es una marca de tiempo ISO 8601, no la cadena cruda del encabezado
RFC 2822.
spfResult | Descripción |
|---|---|
None | No se encontró registro SPF o no se realizó la comprobación |
Pass | El remitente está autorizado |
Fail | El remitente no está autorizado |
SoftFail | El remitente podría no estar autorizado |
Neutral | Sin declaración sobre autorización |
TempError | Error temporal de DNS |
PermError | Error permanente de DNS |
dkimResult | Descripción |
|---|---|
None | No se encontró firma DKIM o no se realizó la comprobación |
Pass | Firma verificada |
Fail | Verificación de firma fallida |
TempError | Error temporal de DNS |
PermError | Error permanente de DNS |
dmarcResult | Descripción |
|---|---|
None | No se encontró política DMARC o no se realizó la comprobación |
Pass | Alineación superada |
Fail | Alineación fallida |
Quarantine | La política recomienda cuarentena |
Reject | La política recomienda rechazo |
Descargar correo sin procesar
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.emlDevuelve el correo original sin procesar (formato RFC 5322) como archivo descargable.
Eliminar correos
Eliminar un solo correo:
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..."Eliminar correos en lote:
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"]
}'También existe POST /v1/transactional/inbound/emails/bulk-mark-spam, con el mismo cuerpo {"ids": [...]}, para marcar como spam el mismo lote de correos en una sola llamada.
Cuarentena
Los correos con isSpam: true aparecen aquí (no hay análisis antivirus ni un estado Quarantined independiente; el spam es solo un indicador booleano). Ver correos en cuarentena:
GET https://api.mail.land/v1/transactional/inbound/quarantinecurl https://api.mail.land/v1/transactional/inbound/quarantine \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Liberar un correo de la cuarentena:
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..."Liberar un correo solo borra su indicador isSpam. No vuelve a ejecutar el enrutamiento ni reenvía los webhooks. Para volver a entregar el webhook de un correo liberado (o cualquiera), llame a POST /v1/transactional/inbound/emails/{id}/replay-webhook: esto encola una entrega duradera al webhook de la ruta coincidente y devuelve 202 Accepted (consulte Inbound Webhooks). Un parámetro de consulta opcional ?addToAllowlist=true también agrega al remitente a la lista de permitidos en el momento de la liberación.
Lista de permitidos y lista de bloqueados
Lista de permitidos
Los correos de remitentes en la lista de permitidos omiten el filtrado de 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"
}'Se devuelve y envía como cadena de texto, no como número:
| Tipo de coincidencia | Descripción |
|---|---|
ExactEmail | Coincide con una dirección de correo exacta |
Domain | Coincide con todos los correos de un dominio |
WildcardPattern | Coincidencia por patrón comodín |
Lista de bloqueados
Los correos de remitentes en la lista de bloqueados se gestionan automáticamente:
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"
}'Se devuelve y envía como cadena de texto, no como número. La acción predeterminada es MarkAsSpam si se omite:
| Acción de bloqueo | Descripción |
|---|---|
RejectAtSmtp | Rechazar a nivel SMTP (respuesta 550) |
MarkAsSpam | Aceptar pero marcar como spam (predeterminado) |
Drop | Descartar el correo silenciosamente |
Eliminar de la lista de permitidos o de bloqueados:
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..."Estadísticas de entrada
GET https://api.mail.land/v1/transactional/inbound/statscurl https://api.mail.land/v1/transactional/inbound/stats \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Parámetro | Tipo | Descripción |
|---|---|---|
domainId | string | Filtrar por ID pública del dominio |
from | datetime | Filtrar por receivedAt en o después de esta hora |
to | datetime | Filtrar por receivedAt antes del final de este día |
{
"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 }
]
}No hay campo spamRate/averageSizeBytes; la estructura anterior es exhaustiva.
Respuestas de error
| Estado | Código | Descripción |
|---|---|---|
400 | VALIDATION_FAILED | Parámetros de solicitud no válidos |
403 | FORBIDDEN | Permisos insuficientes |
404 | RESOURCE_NOT_FOUND | Correo no encontrado |