Aller au contenu principal
MailLand

Guide de migration

Migrer de Postmark vers Mail.Land

Postmark et Mail.Land acceptent tous deux un appel d’envoi en JSON : la plupart des champs se correspondent donc un à un. Ce guide liste chaque champ courant, les réglages SMTP à modifier et les différences qui demandent une modification du code.

SMTP
# Before (Postmark)
SMTP_HOST=smtp.postmarkapp.com   # broadcasts: smtp-broadcasts.postmarkapp.com
SMTP_PORT=587                    # STARTTLS
SMTP_USER=<Server API token, or SMTP token access key>
SMTP_PASS=<Server API token, or SMTP token secret key>

# 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_...   # transactional; use an ml_pem_ key for broadcasts

Les notions de Postmark dans Mail.Land

Les notions de Postmark dans Mail.Land
PostmarkMail.Land
Server et Server API tokenEspace de travail et clés API (identifiants), chacune limitée à l’API ou au SMTP, à des domaines et à des adresses IP
Flux de messages (transactionnel, diffusion)Le flux de la clé : transactionnel (ml_pet_) ou marketing (ml_pem_)
Signatures d’expéditeur et domainesDomaine vérifié (SPF, DKIM, DMARC et chemin de retour)
Modèles et mises en page (Mustachio)Modèles avec variables {{name}}
Suppressions par flux de messagesSuppressions avec un type et une portée
WebhooksWebhooks signés en HMAC-SHA256, avec un secret par webhook
Flux entrantRoutes entrantes

Créer les bonnes clés API

Chez Postmark, le champ ou l’en-tête MessageStream choisit le flux. Chez Mail.Land, c’est la clé : son préfixe indique son mode et son flux. Créez une clé par application et par flux.

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 les identifiants

Postmark utilise un Server API token ou un SMTP token, et un en-tête pour choisir le flux. Mail.Land utilise votre clé API comme mot de passe, ignore le nom d’utilisateur et déduit le flux de la clé.

Basculer le SMTP : changer l’hôte et les identifiants
ParamètrePostmarkMail.Land
Hôtesmtp.postmarkapp.com, ou smtp-broadcasts.postmarkapp.com pour les diffusionssmtp.mail.land
Port25, 587 ou 2525, avec STARTTLS587 avec STARTTLS
Nom d’utilisateurServer API token, ou access key du SMTP tokenN’importe quelle valeur, par exemple apikey
Mot de passeServer API token, ou secret key du SMTP tokenUne clé API Mail.Land avec SMTP activé
FluxEn-tête X-PM-Message-StreamLa clé : ml_pet_ pour le transactionnel, ml_pem_ pour le marketing

Mail.Land n’accepte l’authentification qu’après STARTTLS. Mail.Land ne tient pas compte de l’en-tête X-PM-Message-Stream : c’est la clé qui détermine le flux. Les messages peuvent atteindre 15 Mio.

Documentation du relais SMTP

Basculer l’appel d’API

Les deux API acceptent du JSON. Postmark utilise des noms en PascalCase et l’en-tête X-Postmark-Server-Token ; Mail.Land utilise des noms en camelCase et l’en-tête X-API-Key. Voici le même message dans les deux, ainsi qu’un envoi avec modèle.

curl -X POST https://api.postmarkapp.com/email \
  -H "X-Postmark-Server-Token: $POSTMARK_SERVER_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "From": "Your Shop <[email protected]>",
    "To": "[email protected]",
    "ReplyTo": "[email protected]",
    "Subject": "Order 12345 has shipped",
    "TextBody": "Your order is on its way.",
    "HtmlBody": "<p>Your order is on its way.</p>",
    "Tag": "order-shipped",
    "MessageStream": "outbound"
  }'
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 /email et /email/withTemplate à POST /v1/transactional/send.

Correspondance des champs de l’appel d’envoi
PostmarkMail.LandRemarque
X-Postmark-Server-Token: <token>X-API-Key: <key>Un autre en-tête.
Fromfrom.email, from.nameSéparez le nom affiché de l’adresse. L’adresse doit appartenir à un domaine vérifié.
Toto[].email, to[].nameUn tableau d’objets au lieu d’une chaîne séparée par des virgules. Jusqu’à 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.
HtmlBodyhtmlContent
TextBodytextContent
ReplyToreplyToUne seule chaîne d’adresse. Si vous utilisiez plusieurs adresses reply-to séparées par des virgules, gardez-en une.
TagtagsUn tableau : un message peut donc porter plusieurs tags.
MetadataAucunIl n’y a pas de champ de métadonnées clé-valeur. Utilisez tags, ou un en-tête personnalisé.
Headers [{ Name, Value }]customHeadersUn objet de noms et de valeurs d’en-têtes au lieu d’un tableau.
TrackOpenstracking.opensLe choix propre au domaine pour le suivi des ouvertures est prioritaire.
TrackLinkstracking.clicksUn booléen au lieu de None, HtmlAndText, HtmlOnly ou TextOnly.
Attachments[].Name, Content, ContentType, ContentIDattachments[].fileName, content, contentType, contentId, inlineContenu Base64 comme avant. Indiquez inline: true pour une image intégrée. Jusqu’à 10 pièces jointes et 10 Mio au total.
MessageStreamAucunLa clé détermine le flux : ml_pet_ ou ml_pem_.
TemplateId, TemplateAliastemplateIdRecréez d’abord le modèle dans Mail.Land ; il reçoit un nouvel identifiant.
TemplateModelvariables, to[].variablesValeurs plates uniquement, car les variables n’ont ni sections ni boucles.
POST /email/batch (jusqu’à 500 messages)POST /v1/transactional/send-batchUn modèle différent : un contenu commun pour jusqu’à 10 000 destinataires, chacun avec ses variables, envoyé avec une clé marketing. Pour des messages différents, faites un appel d’envoi pour chacun.
Aucun équivalentscheduledAtProgrammez un message jusqu’à 7 jours à l’avance.
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 Postmark 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 Postmark.
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 Postmark 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

Postmark conserve les suppressions par flux de messages. Exportez la liste de chaque flux, par exemple avec GET /message-streams/<stream>/suppressions/dump, puis importez-la 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
Motif chez PostmarkType Mail.LandPortée
HardBounceHardBounceGlobal
SpamComplaintComplaintGlobal
ManualSuppression sur un flux de diffusion (désabonnements)UnsubscribeMarketing ; ou List, qui ne s’applique qu’aux campagnes envoyées à la liste de diffusion Mail.Land correspondante
ManualSuppression sur un flux transactionnelManualTransactional

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 avec le secret de ce webhook. Si vous protégiez votre endpoint Postmark par authentification Basic ou liste d’IP autorisées, vérifiez plutôt la signature.

Diriger vos webhooks vers Mail.Land
Webhook PostmarkÉvénement Mail.LandRemarque
Livraison (Delivery)message.delivered
Rebond (Bounce)message.bouncedCouvre les rebonds définitifs et temporaires. Les retards temporaires sont des message.deferred.
Plainte pour spam (Spam complaint)message.complained
Changement d’abonnement (Subscription change)message.unsubscribedEnvoyé lorsque le destinataire se désabonne lui-même, pas pour les changements que vous faites via l’API.
Ouverture, clic (Open, Click)Pas encore disponibleLes événements d’ouverture et de clic figurent au catalogue mais ne sont pas envoyés aujourd’hui.
Entrant (Inbound)inbound.receivedConfigurez une route entrante pour l’adresse de réception.
Erreur SMTP APIAucunLe relais SMTP refuse le message pendant la session, avec un code de réponse.

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
PostmarkMail.Land
{{firstName}}{{firstName}}
{{#each items}} ... {{/each}}Aucun
{{#section}}, {{^section}}Aucun
Modèles de mise en page (layout)Aucun

Les variables Mail.Land sont simples : ni sections, ni boucles, ni mises en page. Passez des valeurs plates, construisez les listes dans votre application, et répétez le HTML commun d’en-tête et de pied de page dans chaque modèle.

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 suppressions de chaque flux de messages Postmark et importez-les.
  3. Créez une clé transactionnelle pour chaque application, et une clé marketing si vous envoyez des diffusions.
  4. Recréez vos modèles et vos webhooks.
  5. 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.
  6. Envoyez de vrais messages à des adresses que vous contrôlez et vérifiez-les dans le journal des e-mails.
  7. Déplacez une application ou une petite part du trafic, puis surveillez la livraison, les rebonds et les plaintes.
  8. Tant que les deux fournisseurs fonctionnent, synchronisez les désinscriptions dans les deux sens : copiez les nouveaux désabonnements, plaintes et rebonds de Postmark vers Mail.Land et de Mail.Land vers Postmark, et faites une synchronisation finale avant de déplacer le trafic restant.
  9. 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.
  10. Déplacez ensuite le reste, et gardez Postmark actif jusqu’au départ de ses derniers messages.

Mail.Land ou Postmark : la comparaison sourcée

Sources

Pages publiques de Postmark utilisées pour ce guide.

  1. [1]Postmark Email APIhttps://postmarkapp.com/developer/api/email-apivérifié le 4 novembre 2026
  2. [2]Postmark Templates APIhttps://postmarkapp.com/developer/api/templates-apivérifié le 4 novembre 2026
  3. [3]Postmark : envoyer des e-mails avec SMTPhttps://postmarkapp.com/developer/user-guide/send-email-with-smtpvérifié le 4 novembre 2026
  4. [4]Postmark : présentation des webhookshttps://postmarkapp.com/developer/webhooks/webhooks-overviewvérifié le 4 novembre 2026
  5. [5]Postmark Suppressions APIhttps://postmarkapp.com/developer/api/suppressions-apivérifié le 4 novembre 2026

Questions fréquentes

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

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

Mail.Land prend-il en charge cc et bcc ?

Pas dans l’appel d’envoi. Chaque destinataire reçoit une copie distincte : envoyez donc un message séparé là où vous utilisiez cc ou bcc.

Comment remplacer mon flux de diffusion ?

Utilisez une clé marketing (ml_pem_) avec send-batch pour les envois par API, ou créez une campagne dans le tableau de bord avec le plan Pro ou Max.

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 Postmark ?

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.