MailLandDocs
Email entrante

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}/settings

Autentíquese con Authorization: Bearer <token> o 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
}

Actualizar configuración:

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
  }'
CampoTipoDescripción
isEnabledboolActivar/desactivar el procesamiento de entrada para este dominio
catchAllEnabledboolAceptar correo para cualquier destinatario del dominio, no solo los que coinciden con una ruta habilitada
maxMessageSizeBytesintTamañ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
dailyLimitintMáximo de mensajes de entrada aceptados por día para este dominio
retentionDaysintDías que se conservan los correos almacenados. Predeterminado 30, permitido 1–90
storeEmailsboolSi se almacena el correo analizado completo para su recuperación posterior
routeCountintNú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:

EstadoDescripción
ReceivedCorreo recibido, pendiente de procesamiento
ProcessingEn proceso (análisis, verificación de spam, enrutamiento)
ProcessedProcesado y su acción completada
DeliveredEntregado con éxito (reenviado o webhook enviado)
FailedError en el procesamiento
ExpiredPerí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/emails
List inbound emails
curl https://api.mail.land/v1/transactional/inbound/emails \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
ParámetroTipoPredeterminadoDescripción
cursorstring-Cursor opaco proveniente del nextCursor de la página anterior. Omítalo para la primera página.
limitint20Elementos por página (máx. 100), se limita en vez de rechazarse
domainIdstring-Filtrar por ID pública del dominio
statusstring-Filtrar por estado del correo (Received, Processing, Processed, Delivered, Failed, Expired)
routeIdstring-Filtrar por ruta coincidente
isSpambool-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.
fromdatetime-Correos recibidos después de esta hora
todatetime-Correos recibidos antes de esta hora
searchstring-Busca en el asunto y el remitente (dirección o nombre); no coincide con el destinatario
sortBystring-Campo de ordenación: subject, from, o el predeterminado receivedAt
sortDescbooltrueOrdenar de forma descendente
excludeQuarantinedbooltrueExcluir de la lista los correos marcados como spam. Se ignora si se indica isSpam.
includeWebhookOnlyboolfalseIncluir 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).

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
}

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}
Get email details
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).

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

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.

spfResultDescripción
NoneNo se encontró registro SPF o no se realizó la comprobación
PassEl remitente está autorizado
FailEl remitente no está autorizado
SoftFailEl remitente podría no estar autorizado
NeutralSin declaración sobre autorización
TempErrorError temporal de DNS
PermErrorError permanente de DNS
dkimResultDescripción
NoneNo se encontró firma DKIM o no se realizó la comprobación
PassFirma verificada
FailVerificación de firma fallida
TempErrorError temporal de DNS
PermErrorError permanente de DNS
dmarcResultDescripción
NoneNo se encontró política DMARC o no se realizó la comprobación
PassAlineación superada
FailAlineación fallida
QuarantineLa política recomienda cuarentena
RejectLa política recomienda rechazo

Descargar correo sin procesar

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

Devuelve 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}
Delete inbound email
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
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"]
  }'

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/quarantine
List quarantined emails
curl 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}/release
Release from quarantine
curl -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/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"
  }'

Se devuelve y envía como cadena de texto, no como número:

Tipo de coincidenciaDescripción
ExactEmailCoincide con una dirección de correo exacta
DomainCoincide con todos los correos de un dominio
WildcardPatternCoincidencia 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/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"
  }'

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 bloqueoDescripción
RejectAtSmtpRechazar a nivel SMTP (respuesta 550)
MarkAsSpamAceptar pero marcar como spam (predeterminado)
DropDescartar 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 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..."

Estadísticas de entrada

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..."
ParámetroTipoDescripción
domainIdstringFiltrar por ID pública del dominio
fromdatetimeFiltrar por receivedAt en o después de esta hora
todatetimeFiltrar por receivedAt antes del final de este día
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 }
  ]
}

No hay campo spamRate/averageSizeBytes; la estructura anterior es exhaustiva.

Respuestas de error

EstadoCódigoDescripción
400VALIDATION_FAILEDParámetros de solicitud no válidos
403FORBIDDENPermisos insuficientes
404RESOURCE_NOT_FOUNDCorreo no encontrado

Próximos pasos

  • Rutas: configure reglas de enrutamiento para correos entrantes
  • Webhooks: reciba datos de correo analizados mediante webhook
  • Dominios: configure registros MX para el procesamiento de entrada

En esta página