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.
# 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 enabledConceptos de Mailgun en Mail.Land
| Mailgun | Mail.Land |
|---|---|
| Dominio de envío | Dominio verificado (SPF, DKIM, DMARC y return path) |
| Clave de API y claves de envío del dominio | Claves de API (credenciales), cada una limitada a la API o a SMTP, a dominios y a direcciones IP |
| Credenciales SMTP por dominio | La misma clave de API, usada como contraseña SMTP |
| Plantillas (Handlebars) | Plantillas con marcadores {{name}} |
| Listas de rebotes, quejas y bajas | Supresiones con un tipo y un ámbito |
| Webhooks | Webhooks 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.
| Prefijo | Para 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.
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.
| Ajuste | Mailgun | Mail.Land |
|---|---|---|
| Host | smtp.mailgun.org | smtp.mail.land |
| Puerto | 25, 587 o 2525 con STARTTLS, o 465 con TLS | 587 con STARTTLS |
| Nombre de usuario | El usuario SMTP de su dominio de envío | Cualquier valor, por ejemplo apikey |
| Contraseña | La contraseña de ese usuario SMTP | Una 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.
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.
| Mailgun | Mail.Land | Nota |
|---|---|---|
--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. |
from | from.email, from.name | Separe el nombre visible de la dirección. La dirección debe pertenecer a un dominio verificado. |
to | to[].email, to[].name | Hasta 5 destinatarios por solicitud con una clave transaccional; cada uno recibe una copia separada. |
cc, bcc | Ninguno | No se admite. Envíe un mensaje separado a cada destinatario. |
subject | subject | Obligatorio salvo que use una plantilla. |
text | textContent | |
html | htmlContent | |
amp-html | Ninguno | No hay parte AMP. |
template, t:version | templateId | Vuelva a crear antes la plantilla en Mail.Land. Las plantillas no tienen versiones. |
t:variables | variables | Valores compartidos por todos los destinatarios, como objeto JSON en lugar de cadena JSON. |
v:<name> (metadata) | tags | Mail.Land no tiene metadatos de clave y valor en los eventos. Lleve un identificador en tags o en una cabecera personalizada. |
recipient-variables | to[].variables | Valores por destinatario. Para más de 5 destinatarios, use send-batch con una clave de marketing y recipients[].variables. |
o:tag | tags | Un array de cadenas. |
h:<Header-Name> | customHeaders | Un objeto con nombres y valores de cabecera. |
h:Reply-To | replyTo | Una cadena de dirección simple. |
attachment, inline | attachments[].fileName, contentType, content, contentId, inline | Contenido Base64 en JSON en lugar de archivos multipart. Hasta 10 adjuntos y 10 MiB en total. |
o:deliverytime | scheduledAt | Fecha y hora UTC en formato ISO 8601, hasta 7 días de antelación. |
o:tracking-opens, o:tracking-clicks | tracking.opens, tracking.clicks | Booleanos. La opción de seguimiento de aperturas del propio dominio tiene prioridad. |
Sin equivalente | Cabecera X-Idempotency-Key | Dentro 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.
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.
| Registro | Nombre | Valor | Nota |
|---|---|---|---|
| SPF (TXT) | yourdomain.com | include:spf.mlnd.net | Añada el include a su registro SPF actual. Un dominio solo debe tener un registro SPF. |
| DKIM (TXT) | mlnd._domainkey.yourdomain.com | v=DKIM1; k=rsa; p=... | El selector es mlnd, así que el registro convive con el registro DKIM de Mailgun. |
| DMARC (TXT) | _dmarc.yourdomain.com | v=DMARC1; p=... | Obligatorio. Mantenga un único registro DMARC; basta con uno existente que tenga una política. |
| Return path (CNAME) | bounce.yourdomain.com | bounce.mlnd.net | Configú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.
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.
| Lista de Mailgun | Tipo en Mail.Land | Ámbito |
|---|---|---|
| Rebotes (Bounces) | HardBounce | Global |
| Quejas (Complaints) | Complaint | Global |
| Bajas (todo el correo) | Unsubscribe | Global |
| Bajas de una etiqueta o una lista de correo | Unsubscribe | Marketing; 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.
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.
| Evento de Mailgun | Evento de Mail.Land | Nota |
|---|---|---|
accepted | Ninguno por ahora | message.sent aún no está disponible; la respuesta 202 confirma la aceptación. |
delivered | message.delivered | |
temporary_fail | message.deferred | |
permanent_fail | message.bounced | Un rechazo del servidor receptor. message.failed informa de una detención por parte de Mail.Land. |
complained | message.complained | |
unsubscribed | message.unsubscribed | Se envía cuando el destinatario se da de baja por sí mismo, no por cambios que usted haga mediante la API. |
opened, clicked | Aún no disponible | Los 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.
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.
| Mailgun | Mail.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.
Cambie paso a paso
- Añada y verifique su dominio de envío en Mail.Land, agregando include:spf.mlnd.net a su registro SPF actual.
- Exporte las listas de supresión de cada dominio de Mailgun e impórtelas.
- Vuelva a crear sus plantillas y webhooks.
- Cree una clave de pruebas con sandboxBehavior en LogOnly y ejecute sus pruebas de integración contra Mail.Land sin entregar correo.
- Envíe mensajes reales a direcciones que usted controle y revíselos en el registro de correo.
- Traslade una aplicación o una pequeña parte del tráfico y vigile la entrega, los rebotes y las quejas.
- 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.
- 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.
- Después traslade el resto y mantenga Mailgun activo hasta que hayan salido sus últimos mensajes programados y reintentados.
Fuentes
Páginas públicas de Mailgun utilizadas en esta guía.
- [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]API de Mailgun: autenticaciónhttps://documentation.mailgun.com/docs/mailgun/api-reference/authenticationcomprobado el 4 de noviembre de 2026
- [3]Mailgun: envío por SMTPhttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-smtpcomprobado el 4 de noviembre de 2026
- [4]Mailgun: envío con plantillashttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-templatescomprobado el 4 de noviembre de 2026
- [5]Mailgun: webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/webhookscomprobado el 4 de noviembre de 2026
- [6]Mailgun: protección de webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/securing-webhookscomprobado el 4 de noviembre de 2026
- [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.