Saltar al contenido principal
MailLand

Guía de migración

Migrar de Mailgun a Mail.Land

Si envía por SMTP, el cambio es un host y una contraseña. Si usa la API de mensajes, esta guía hace corresponder cada campo habitual de Mailgun con Mail.Land e indica lo que requiere cambios en el código.

SMTP
# Before (Mailgun)
SMTP_HOST=smtp.mailgun.org
SMTP_PORT=587          # STARTTLS
SMTP_USER=<SMTP login of your sending domain>
SMTP_PASS=<SMTP password of that login>

# After (Mail.Land)
SMTP_HOST=smtp.mail.land
SMTP_PORT=587          # STARTTLS
SMTP_USER=apikey       # any value; Mail.Land ignores it
SMTP_PASS=ml_pet_...   # a Mail.Land key with SMTP enabled

Conceptos de Mailgun en Mail.Land

Conceptos de Mailgun en Mail.Land
MailgunMail.Land
Dominio de envíoDominio verificado (SPF, DKIM, DMARC y return path)
Clave de API y claves de envío del dominioClaves de API (credenciales), cada una limitada a la API o a SMTP, a dominios y a direcciones IP
Credenciales SMTP por dominioLa misma clave de API, usada como contraseña SMTP
Plantillas (Handlebars)Plantillas con marcadores {{name}}
Listas de rebotes, quejas y bajasSupresiones con un tipo y un ámbito
WebhooksWebhooks firmados con HMAC-SHA256, con un secreto por webhook
Rutas (Routes)Rutas de entrada

Cree las claves de API adecuadas

El prefijo de una clave de Mail.Land indica su modo y su flujo. Cree una clave por aplicación y por flujo, y mantenga las claves de producción fuera de sus sistemas de prueba.

Cree las claves de API adecuadas
PrefijoPara qué sirve
ml_pet_Producción, transaccional: recibos, restablecimiento de contraseñas, alertas. Hasta 5 destinatarios por solicitud.
ml_pem_Producción, marketing: boletines y envíos masivos con send-batch, hasta 10.000 destinatarios por llamada.
ml_set_Pruebas, transaccional: con sandboxBehavior en LogOnly (el valor por defecto), las solicitudes se aceptan y se registran, pero nunca se entregan. Úsela para sus pruebas de integración.

Cada clave puede limitarse a la API, a SMTP o a ambos, a dominios seleccionados y a direcciones IP conocidas. La clave se muestra una sola vez y Mail.Land solo guarda un hash de ella.

Documentación de claves de API

Cambie SMTP: modifique el host y la contraseña

Mailgun usa un usuario SMTP por dominio de envío. Mail.Land usa su clave de API como contraseña e ignora el nombre de usuario.

Cambie SMTP: modifique el host y la contraseña
AjusteMailgunMail.Land
Hostsmtp.mailgun.orgsmtp.mail.land
Puerto25, 587 o 2525 con STARTTLS, o 465 con TLS587 con STARTTLS
Nombre de usuarioEl usuario SMTP de su dominio de envíoCualquier valor, por ejemplo apikey
ContraseñaLa contraseña de ese usuario SMTPUna clave de API de Mail.Land con SMTP habilitado (ml_pet_ para correo transaccional)

Mail.Land solo acepta el inicio de sesión después de STARTTLS y no ofrece el puerto 465. Si su aplicación usa el 465, cámbiela al 587 con STARTTLS. Los mensajes pueden ocupar hasta 15 MiB.

Documentación del relé SMTP

Cambie la llamada a la API

Mailgun recibe campos de formulario con autenticación HTTP Basic. Mail.Land recibe un cuerpo JSON con la cabecera X-API-Key. Este es el mismo mensaje en ambas API, y un envío por lotes.

curl -s --user "api:$MAILGUN_API_KEY" \
  https://api.mailgun.net/v3/yourdomain.com/messages \
  -F from="Your Shop <[email protected]>" \
  -F to="Jane <[email protected]>" \
  -F subject="Order 12345 has shipped" \
  -F text="Your order is on its way." \
  -F html="<p>Your order is on its way.</p>" \
  -F h:Reply-To="[email protected]" \
  -F o:tag="order-shipped"
curl -X POST https://api.mail.land/v1/transactional/send \
  -H "X-API-Key: $MAILLAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": { "email": "[email protected]", "name": "Your Shop" },
    "to": [{
      "email": "[email protected]", "name": "Jane",
      "variables": { "orderNumber": "12345" }
    }],
    "replyTo": "[email protected]",
    "subject": "Order {{orderNumber}} has shipped",
    "textContent": "Your order {{orderNumber}} is on its way.",
    "htmlContent": "<p>Your order {{orderNumber}} is on its way.</p>",
    "tags": ["order-shipped"]
  }'
# MAILLAND_API_KEY=ml_pet_...  (production, transactional)

Correspondencia de campos de la llamada de envío

De POST /v3/<domain>/messages a POST /v1/transactional/send.

Correspondencia de campos de la llamada de envío
MailgunMail.LandNota
--user api:<key> (autenticación Basic)X-API-Key: <key>Una cabecera en lugar de autenticación Basic, y un cuerpo JSON en lugar de campos de formulario.
fromfrom.email, from.nameSepare el nombre visible de la dirección. La dirección debe pertenecer a un dominio verificado.
toto[].email, to[].nameHasta 5 destinatarios por solicitud con una clave transaccional; cada uno recibe una copia separada.
cc, bccNingunoNo se admite. Envíe un mensaje separado a cada destinatario.
subjectsubjectObligatorio salvo que use una plantilla.
texttextContent
htmlhtmlContent
amp-htmlNingunoNo hay parte AMP.
template, t:versiontemplateIdVuelva a crear antes la plantilla en Mail.Land. Las plantillas no tienen versiones.
t:variablesvariablesValores compartidos por todos los destinatarios, como objeto JSON en lugar de cadena JSON.
v:<name> (metadata)tagsMail.Land no tiene metadatos de clave y valor en los eventos. Lleve un identificador en tags o en una cabecera personalizada.
recipient-variablesto[].variablesValores por destinatario. Para más de 5 destinatarios, use send-batch con una clave de marketing y recipients[].variables.
o:tagtagsUn array de cadenas.
h:<Header-Name>customHeadersUn objeto con nombres y valores de cabecera.
h:Reply-ToreplyToUna cadena de dirección simple.
attachment, inlineattachments[].fileName, contentType, content, contentId, inlineContenido Base64 en JSON en lugar de archivos multipart. Hasta 10 adjuntos y 10 MiB en total.
o:deliverytimescheduledAtFecha y hora UTC en formato ISO 8601, hasta 7 días de antelación.
o:tracking-opens, o:tracking-clickstracking.opens, tracking.clicksBooleanos. La opción de seguimiento de aperturas del propio dominio tiene prioridad.
Sin equivalenteCabecera X-Idempotency-KeyDentro del periodo de conservación, un reintento con la misma clave devuelve la respuesta original en lugar de volver a enviar.

Mail.Land responde 202 Accepted con un jobId, un ID de mensaje por cada destinatario aceptado y las listas de destinatarios aceptados y rechazados.

Documentación de la API REST

Añada su dominio y los registros DNS

Añada el dominio en Mail.Land y publique los registros que muestra el panel. SPF, DKIM y DMARC deben verificarse antes de poder enviar. Puede hacerlo mientras Mailgun sigue enviando.

Añada su dominio y los registros DNS
RegistroNombreValorNota
SPF (TXT)yourdomain.cominclude:spf.mlnd.netAñada el include a su registro SPF actual. Un dominio solo debe tener un registro SPF.
DKIM (TXT)mlnd._domainkey.yourdomain.comv=DKIM1; k=rsa; p=...El selector es mlnd, así que el registro convive con el registro DKIM de Mailgun.
DMARC (TXT)_dmarc.yourdomain.comv=DMARC1; p=...Obligatorio. Mantenga un único registro DMARC; basta con uno existente que tenga una política.
Return path (CNAME)bounce.yourdomain.combounce.mlnd.netConfigúrelo como DNS only, sin proxy. Compruebe que ese nombre no esté ya en uso.

Mantenga los registros DNS de Mailgun hasta terminar el traslado y elimínelos solo cuando haya salido su último mensaje.

Documentación de configuración DNS

Importe primero sus listas de supresión

Mailgun guarda rebotes, quejas y bajas por dominio de envío, así que exporte las listas de cada dominio desde el que envía, por ejemplo con GET /v3/<domain>/bounces. Después importe cada lista en Mail.Land con el tipo y el ámbito correspondientes, en el panel o con POST /v1/transactional/suppressions/import.

Importe primero sus listas de supresión
Lista de MailgunTipo en Mail.LandÁmbito
Rebotes (Bounces)HardBounceGlobal
Quejas (Complaints)ComplaintGlobal
Bajas (todo el correo)UnsubscribeGlobal
Bajas de una etiqueta o una lista de correoUnsubscribeMarketing; o List, que solo se aplica a las campañas enviadas a la lista de correo correspondiente de Mail.Land

Importe antes de su primer envío a través de Mail.Land, para que quienes se dieron de baja sigan suprimidos desde el principio. Las direcciones que ya existen se omiten, no se duplican.

Documentación de supresiones

Dirija sus webhooks a Mail.Land

Añada su endpoint en Mail.Land, elija los eventos y verifique la cabecera X-MLND-Signature. Mailgun firma una marca de tiempo y un token con una sola clave para toda la cuenta; Mail.Land firma la marca de tiempo y el cuerpo sin procesar con un secreto por webhook, así que actualice también su código de verificación.

Dirija sus webhooks a Mail.Land
Evento de MailgunEvento de Mail.LandNota
acceptedNinguno por ahoramessage.sent aún no está disponible; la respuesta 202 confirma la aceptación.
deliveredmessage.delivered
temporary_failmessage.deferred
permanent_failmessage.bouncedUn rechazo del servidor receptor. message.failed informa de una detención por parte de Mail.Land.
complainedmessage.complained
unsubscribedmessage.unsubscribedSe envía cuando el destinatario se da de baja por sí mismo, no por cambios que usted haga mediante la API.
opened, clickedAún no disponibleLos eventos de apertura y clic están catalogados, pero hoy no se envían.

Elimine duplicados por event_id, ya que una entrega reintentada lleva el mismo ID de evento. Un estado puede corregirse más tarde, así que siga procesando eventos después de uno final y compare status_version.

Eventos de webhook

Verificación de firmas de webhook

Vuelva a crear sus plantillas

Cree cada plantilla en el panel de Mail.Land o con la API de plantillas y envíela con templateId y variables. Cada marcador necesita un valor; si falta, el envío se rechaza con 422 y los nombres que faltan.

Vuelva a crear sus plantillas
MailgunMail.Land
{{firstName}}{{firstName}}
%recipient.firstName%{{firstName}}
{{#if}}, {{#unless}}, {{#each}}, {{#with}}, {{#equal}}Ninguno
Versiones de plantilla (t:version)Ninguno

Los marcadores de Mail.Land son simples: sin condiciones, bucles, filtros ni parciales. Traslade esa lógica a su aplicación o mantenga una plantilla por variante.

Documentación de plantillas

Cambie paso a paso

  1. Añada y verifique su dominio de envío en Mail.Land, agregando include:spf.mlnd.net a su registro SPF actual.
  2. Exporte las listas de supresión de cada dominio de Mailgun e impórtelas.
  3. Vuelva a crear sus plantillas y webhooks.
  4. Cree una clave de pruebas con sandboxBehavior en LogOnly y ejecute sus pruebas de integración contra Mail.Land sin entregar correo.
  5. Envíe mensajes reales a direcciones que usted controle y revíselos en el registro de correo.
  6. Traslade una aplicación o una pequeña parte del tráfico y vigile la entrega, los rebotes y las quejas.
  7. Mientras funcionen ambos proveedores, mantenga sincronizadas las bajas en los dos sentidos: copie las nuevas bajas, quejas y rebotes de Mailgun a Mail.Land y de Mail.Land a Mailgun, y haga una sincronización final antes de trasladar el tráfico restante.
  8. Revise el calentamiento de su dominio: en Free y Pro, un dominio nuevo tiene un límite diario que sube por etapas, y los envíos que lo superan se rechazan. Planifique el traslado dentro de esos límites o consúltenos un calendario a medida. Max no pasa por calentamiento.
  9. Después traslade el resto y mantenga Mailgun activo hasta que hayan salido sus últimos mensajes programados y reintentados.

Mail.Land frente a Mailgun: la comparación documentada

Fuentes

Páginas públicas de Mailgun utilizadas en esta guía.

  1. [1]API de Mailgun: enviar un mensajehttps://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/messages/post-v3--domain-name--messagescomprobado el 4 de noviembre de 2026
  2. [2]API de Mailgun: autenticaciónhttps://documentation.mailgun.com/docs/mailgun/api-reference/authenticationcomprobado el 4 de noviembre de 2026
  3. [3]Mailgun: envío por SMTPhttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-smtpcomprobado el 4 de noviembre de 2026
  4. [4]Mailgun: envío con plantillashttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-templatescomprobado el 4 de noviembre de 2026
  5. [5]Mailgun: webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/webhookscomprobado el 4 de noviembre de 2026
  6. [6]Mailgun: protección de webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/securing-webhookscomprobado el 4 de noviembre de 2026
  7. [7]API de Mailgun: reboteshttps://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/bounces/get-v3--domainid--bouncescomprobado el 4 de noviembre de 2026

Preguntas frecuentes

¿Puedo seguir enviando a través de Mailgun mientras hago pruebas?

Sí. Verificar un dominio en Mail.Land no impide que Mailgun siga enviando en su nombre, así que puede usar ambos y trasladar el tráfico gradualmente.

Mailgun me permite elegir una región de EE. UU. o de la UE. ¿Dónde funciona Mail.Land?

Mail.Land no tiene regiones que elegir. La copia principal de sus datos está en Alemania; los proveedores fuera de la UE figuran en nuestra página sobre el RGPD.

¿Cómo envío a muchos destinatarios a la vez?

Use POST /v1/transactional/send-batch con una clave de marketing (ml_pem_). Admite hasta 10.000 destinatarios, cada uno con sus propias variables. Una clave transaccional admite hasta 5 destinatarios por solicitud.

¿Existe un SDK oficial de Mail.Land?

Todavía no. La documentación incluye ejemplos listos para copiar de la API REST en cURL, Node.js, Python, PHP, C#, Java y Go, y cualquier biblioteca SMTP funciona con el relé.

¿Listo para dejar Mailgun?

Cree una cuenta gratuita y envíe hoy mismo su primera prueba. Si desea ayuda, cuéntenos cómo es su configuración.