Aller au contenu principal
MailLand

Guide de migration

Migrer de Mailgun vers Mail.Land

Si vous envoyez en SMTP, il suffit de changer un hôte et un mot de passe. Si vous utilisez l’API messages, ce guide fait correspondre chaque champ courant de Mailgun à Mail.Land et liste ce qui demande une modification du code.

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

Les notions de Mailgun dans Mail.Land

Les notions de Mailgun dans Mail.Land
MailgunMail.Land
Domaine d’envoiDomaine vérifié (SPF, DKIM, DMARC et chemin de retour)
Clé API et clés d’envoi de domaineClés API (identifiants), chacune limitée à l’API ou au SMTP, à des domaines et à des adresses IP
Identifiants SMTP par domaineLa même clé API, utilisée comme mot de passe SMTP
Modèles (Handlebars)Modèles avec variables {{name}}
Listes de rebonds, de plaintes et de désabonnementsSuppressions avec un type et une portée
WebhooksWebhooks signés en HMAC-SHA256, avec un secret par webhook
RoutesRoutes entrantes

Créer les bonnes clés API

Le préfixe d’une clé Mail.Land indique son mode et son flux. Créez une clé par application et par flux, et tenez les clés de production à l’écart de vos systèmes de test.

Créer les bonnes clés API
PréfixeUsage
ml_pet_Production, transactionnel : reçus, réinitialisations de mot de passe, alertes. Jusqu’à 5 destinataires par requête.
ml_pem_Production, marketing : newsletters et envois en masse avec send-batch, jusqu’à 10 000 destinataires par appel.
ml_set_Test, transactionnel : avec sandboxBehavior sur LogOnly (valeur par défaut), les requêtes sont acceptées et journalisées mais jamais livrées. Utilisez-la pour vos tests d’intégration.

Chaque clé peut être limitée à l’API, au SMTP ou aux deux, à des domaines choisis et à des adresses IP connues. Une clé n’est affichée qu’une fois, et Mail.Land n’en conserve qu’une empreinte (hash).

Documentation des clés API

Basculer le SMTP : changer l’hôte et le mot de passe

Mailgun utilise un identifiant SMTP par domaine d’envoi. Mail.Land utilise votre clé API comme mot de passe et ignore le nom d’utilisateur.

Basculer le SMTP : changer l’hôte et le mot de passe
ParamètreMailgunMail.Land
Hôtesmtp.mailgun.orgsmtp.mail.land
Port25, 587 ou 2525 avec STARTTLS, ou 465 avec TLS587 avec STARTTLS
Nom d’utilisateurL’identifiant SMTP de votre domaine d’envoiN’importe quelle valeur, par exemple apikey
Mot de passeLe mot de passe de cet identifiant SMTPUne clé API Mail.Land avec SMTP activé (ml_pet_ pour l’e-mail transactionnel)

Mail.Land n’accepte l’authentification qu’après STARTTLS, et le port 465 n’est pas proposé. Si votre application utilise le 465, passez au 587 avec STARTTLS. Les messages peuvent atteindre 15 Mio.

Documentation du relais SMTP

Basculer l’appel d’API

Mailgun attend des champs de formulaire avec une authentification HTTP Basic. Mail.Land attend un corps JSON avec l’en-tête X-API-Key. Voici le même message dans les deux API, ainsi qu’un envoi par lot.

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)

Correspondance des champs de l’appel d’envoi

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

Correspondance des champs de l’appel d’envoi
MailgunMail.LandRemarque
--user api:<key> (authentification Basic)X-API-Key: <key>Un en-tête au lieu de l’authentification Basic, et un corps JSON au lieu de champs de formulaire.
fromfrom.email, from.nameSéparez le nom affiché de l’adresse. L’adresse doit appartenir à un domaine vérifié.
toto[].email, to[].nameJusqu’à 5 destinataires par requête avec une clé transactionnelle ; chacun reçoit une copie distincte.
cc, bccAucunNon pris en charge. Envoyez un message distinct à chaque destinataire.
subjectsubjectObligatoire, sauf si vous utilisez un modèle.
texttextContent
htmlhtmlContent
amp-htmlAucunIl n’y a pas de partie AMP.
template, t:versiontemplateIdRecréez d’abord le modèle dans Mail.Land. Les modèles n’ont pas de versions.
t:variablesvariablesValeurs communes à tous les destinataires, sous forme d’objet JSON plutôt que de chaîne JSON.
v:<name> (metadata)tagsMail.Land n’a pas de métadonnées clé-valeur sur les événements. Transportez un identifiant dans tags ou dans un en-tête personnalisé.
recipient-variablesto[].variablesValeurs propres à chaque destinataire. Au-delà de 5 destinataires, utilisez send-batch avec une clé marketing et recipients[].variables.
o:tagtagsUn tableau de chaînes.
h:<Header-Name>customHeadersUn objet de noms et de valeurs d’en-têtes.
h:Reply-ToreplyToUne simple chaîne d’adresse.
attachment, inlineattachments[].fileName, contentType, content, contentId, inlineContenu Base64 dans le JSON au lieu de fichiers multipart. Jusqu’à 10 pièces jointes et 10 Mio au total.
o:deliverytimescheduledAtUne date et une heure UTC au format ISO 8601, jusqu’à 7 jours à l’avance.
o:tracking-opens, o:tracking-clickstracking.opens, tracking.clicksBooléens. Le choix propre au domaine pour le suivi des ouvertures est prioritaire.
Aucun équivalentEn-tête X-Idempotency-KeyPendant la durée de conservation, une nouvelle tentative avec la même clé renvoie la réponse d’origine au lieu d’envoyer à nouveau.

Mail.Land répond 202 Accepted avec un jobId, un identifiant de message par destinataire accepté, et les listes des destinataires acceptés et refusés.

Documentation de l’API REST

Ajouter votre domaine et les enregistrements DNS

Ajoutez le domaine dans Mail.Land et publiez les enregistrements affichés par le tableau de bord. SPF, DKIM et DMARC doivent être vérifiés avant de pouvoir envoyer. Vous pouvez le faire pendant que Mailgun envoie encore.

Ajouter votre domaine et les enregistrements DNS
EnregistrementNomValeurRemarque
SPF (TXT)yourdomain.cominclude:spf.mlnd.netAjoutez l’include à votre enregistrement SPF existant. Un domaine ne doit avoir qu’un seul enregistrement SPF.
DKIM (TXT)mlnd._domainkey.yourdomain.comv=DKIM1; k=rsa; p=...Le sélecteur est mlnd : l’enregistrement coexiste donc avec l’enregistrement DKIM de Mailgun.
DMARC (TXT)_dmarc.yourdomain.comv=DMARC1; p=...Obligatoire. Gardez un seul enregistrement DMARC ; un enregistrement existant avec une politique suffit.
Chemin de retour (CNAME)bounce.yourdomain.combounce.mlnd.netRéglez-le en DNS only, sans proxy. Vérifiez que ce nom n’est pas déjà utilisé.

Gardez les enregistrements DNS de Mailgun jusqu’à la fin de la migration, et supprimez-les seulement après le départ de son dernier message.

Documentation de la configuration DNS

Importer d’abord vos listes de suppression

Mailgun conserve les rebonds, les plaintes et les désabonnements par domaine d’envoi : exportez donc les listes de chaque domaine depuis lequel vous envoyez, par exemple avec GET /v3/<domain>/bounces. Importez ensuite chaque liste dans Mail.Land avec le type et la portée correspondants, dans le tableau de bord ou avec POST /v1/transactional/suppressions/import.

Importer d’abord vos listes de suppression
Liste MailgunType Mail.LandPortée
Rebonds (Bounces)HardBounceGlobal
Plaintes (Complaints)ComplaintGlobal
Désabonnements (tout l’e-mail)UnsubscribeGlobal
Désabonnements d’un tag ou d’une liste de diffusionUnsubscribeMarketing ; ou List, qui ne s’applique qu’aux campagnes envoyées à la liste de diffusion Mail.Land correspondante

Importez avant votre premier envoi via Mail.Land, pour que les personnes désinscrites restent bloquées dès le départ. Les adresses déjà présentes sont ignorées, sans doublon.

Documentation des suppressions

Diriger vos webhooks vers Mail.Land

Ajoutez votre endpoint dans Mail.Land, choisissez les événements et vérifiez l’en-tête X-MLND-Signature. Mailgun signe un horodatage et un jeton avec une clé unique pour tout le compte ; Mail.Land signe l’horodatage et le corps brut avec un secret par webhook : mettez donc aussi à jour votre code de vérification.

Diriger vos webhooks vers Mail.Land
Événement MailgunÉvénement Mail.LandRemarque
acceptedAucun pour l’instantmessage.sent n’est pas encore disponible ; la réponse 202 confirme l’acceptation.
deliveredmessage.delivered
temporary_failmessage.deferred
permanent_failmessage.bouncedUn refus du serveur destinataire. message.failed signale un arrêt du côté de Mail.Land.
complainedmessage.complained
unsubscribedmessage.unsubscribedEnvoyé lorsque le destinataire se désabonne lui-même, pas pour les changements que vous faites via l’API.
opened, clickedPas encore disponibleLes événements d’ouverture et de clic figurent au catalogue mais ne sont pas envoyés aujourd’hui.

Dédupliquez sur event_id, car une livraison relancée porte le même identifiant d’événement. Un statut peut être corrigé plus tard : continuez à traiter les événements après un événement final et comparez status_version.

Événements de webhook

Vérification de la signature des webhooks

Recréer vos modèles

Créez chaque modèle dans le tableau de bord Mail.Land ou avec l’API des modèles, puis envoyez-le avec templateId et variables. Chaque variable doit avoir une valeur, sinon l’envoi est refusé avec un code 422 et les noms manquants.

Recréer vos modèles
MailgunMail.Land
{{firstName}}{{firstName}}
%recipient.firstName%{{firstName}}
{{#if}}, {{#unless}}, {{#each}}, {{#with}}, {{#equal}}Aucun
Versions de modèle (t:version)Aucun

Les variables Mail.Land sont simples : ni conditions, ni boucles, ni filtres, ni partials. Déplacez cette logique dans votre application, ou gardez un modèle par variante.

Documentation des modèles

Basculer étape par étape

  1. Ajoutez et vérifiez votre domaine d’envoi dans Mail.Land, en ajoutant include:spf.mlnd.net à votre enregistrement SPF existant.
  2. Exportez les listes de suppression de chaque domaine Mailgun et importez-les.
  3. Recréez vos modèles et vos webhooks.
  4. Créez une clé de test avec sandboxBehavior sur LogOnly, et lancez vos tests d’intégration sur Mail.Land sans livrer d’e-mail.
  5. Envoyez de vrais messages à des adresses que vous contrôlez et vérifiez-les dans le journal des e-mails.
  6. Déplacez une application ou une petite part du trafic, puis surveillez la livraison, les rebonds et les plaintes.
  7. Tant que les deux fournisseurs fonctionnent, synchronisez les désinscriptions dans les deux sens : copiez les nouveaux désabonnements, plaintes et rebonds de Mailgun vers Mail.Land et de Mail.Land vers Mailgun, et faites une synchronisation finale avant de déplacer le trafic restant.
  8. Vérifiez le préchauffage de votre domaine : en Free et Pro, un nouveau domaine a une limite quotidienne qui augmente par paliers, et les envois au-delà sont refusés. Planifiez la migration dans ces limites, ou demandez-nous un calendrier sur mesure. Max n’a pas de préchauffage.
  9. Déplacez ensuite le reste, et gardez Mailgun actif jusqu’au départ de ses derniers messages programmés et relancés.

Mail.Land ou Mailgun : la comparaison sourcée

Sources

Pages publiques de Mailgun utilisées pour ce guide.

  1. [1]API Mailgun : envoyer un messagehttps://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/messages/post-v3--domain-name--messagesvérifié le 4 novembre 2026
  2. [2]API Mailgun : authentificationhttps://documentation.mailgun.com/docs/mailgun/api-reference/authenticationvérifié le 4 novembre 2026
  3. [3]Mailgun : envoyer avec SMTPhttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-smtpvérifié le 4 novembre 2026
  4. [4]Mailgun : envoyer avec des modèleshttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-templatesvérifié le 4 novembre 2026
  5. [5]Mailgun : webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/webhooksvérifié le 4 novembre 2026
  6. [6]Mailgun : sécuriser les webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/securing-webhooksvérifié le 4 novembre 2026
  7. [7]API Mailgun : rebondshttps://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/bounces/get-v3--domainid--bouncesvérifié le 4 novembre 2026

Questions fréquentes

Puis-je continuer à envoyer via Mailgun pendant mes tests ?

Oui. Vérifier un domaine dans Mail.Land n’empêche pas Mailgun d’envoyer pour lui : vous pouvez faire tourner les deux et déplacer le trafic progressivement.

Mailgun me permet de choisir une région américaine ou européenne. Où fonctionne Mail.Land ?

Mail.Land n’a pas de région à choisir. La copie principale de vos données est en Allemagne ; les prestataires hors de l’UE sont listés sur notre page RGPD.

Comment envoyer à de nombreux destinataires à la fois ?

Utilisez POST /v1/transactional/send-batch avec une clé marketing (ml_pem_). Il accepte jusqu’à 10 000 destinataires, chacun avec ses propres variables. Une clé transactionnelle accepte jusqu’à 5 destinataires par requête.

Existe-t-il un SDK officiel Mail.Land ?

Pas encore. La documentation propose des exemples prêts à copier pour l’API REST en cURL, Node.js, Python, PHP, C#, Java et Go, et toute bibliothèque SMTP fonctionne avec le relais.

Prêt à quitter Mailgun ?

Créez un compte gratuit et envoyez votre premier test dès aujourd’hui. Si vous souhaitez de l’aide, décrivez-nous votre configuration.