Aller au contenu principal
MailLand

Guide de migration

Migrer de SendGrid vers Mail.Land

Souvent, le changement se limite à un hôte SMTP ou à un appel API. Ce guide fait correspondre les champs SendGrid courants à Mail.Land et liste les différences qui nécessitent une modification du code.

SMTP
# Before (SendGrid)
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USER=apikey
SMTP_PASS=<your SendGrid API key>

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

Les concepts SendGrid dans Mail.Land

Les concepts SendGrid dans Mail.Land
SendGridMail.Land
Clé API (API key)Clé API (identifiant), limitée à l’API ou au SMTP, à des domaines et à des adresses IP
Authentification de l’expéditeur (Sender authentication)Vérification du domaine (SPF, DKIM, DMARC et return path)
Modèles dynamiques (Dynamic templates)Modèles avec des variables {{name}}
Suppressions et groupes de désabonnement (unsubscribe groups)Suppressions avec une portée : tous les e-mails, marketing uniquement ou une liste de diffusion donnée
Event WebhookWebhooks signés avec HMAC-SHA256
Inbound ParseRoutes entrantes

Basculer le SMTP : modifiez trois paramètres

Si vous envoyez via SMTP, modifiez l’hôte, le port et le mot de passe. Le nom d’utilisateur peut rester apikey, car Mail.Land l’ignore et authentifie uniquement avec la clé.

Basculer le SMTP : modifiez trois paramètres
ParamètreSendGridMail.Land
Hôtesmtp.sendgrid.netsmtp.mail.land
Port25, 587 ou 2525 (TLS), ou 465 (SSL)587 avec STARTTLS
Nom d’utilisateurapikeyN’importe quelle valeur, par exemple apikey
Mot de passeVotre clé API SendGridUne clé API Mail.Land avec SMTP activé

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

Documentation du relais SMTP

Modifier l’appel API

L’appel d’envoi de Mail.Land utilise un corps JSON plus plat et l’en-tête X-API-Key. Voici le même message dans les deux API.

curl -X POST https://api.sendgrid.com/v3/mail/send \
  -H "Authorization: Bearer $SENDGRID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "personalizations": [{
      "to": [{ "email": "[email protected]", "name": "Jane" }],
      "dynamic_template_data": { "orderNumber": "12345" }
    }],
    "from": { "email": "[email protected]", "name": "Your Shop" },
    "reply_to": { "email": "[email protected]" },
    "subject": "Order 12345 has shipped",
    "content": [
      { "type": "text/plain", "value": "Your order is on its way." },
      { "type": "text/html", "value": "<p>Your order is on its way.</p>" }
    ],
    "categories": ["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 '{
    "to": [{
      "email": "[email protected]", "name": "Jane",
      "variables": { "orderNumber": "12345" }
    }],
    "from": { "email": "[email protected]", "name": "Your Shop" },
    "replyTo": "[email protected]",
    "subject": "Order 12345 has shipped",
    "textContent": "Your order is on its way.",
    "htmlContent": "<p>Your order is on its way.</p>",
    "tags": ["order-shipped"]
  }'

Correspondance des champs de l’appel d’envoi

De POST /v3/mail/send à POST /v1/transactional/send.

Correspondance des champs de l’appel d’envoi
SendGridMail.LandRemarque
Authorization: Bearer <key>X-API-Key: <key>Un en-tête différent.
from.email, from.namefrom.email, from.nameL’adresse doit appartenir à un domaine vérifié.
personalizations[].to[]to[]Jusqu’à 5 destinataires par requête avec une clé transactionnelle. Pour les envois en masse, utilisez l’envoi par lots avec une clé marketing.
personalizations[].cc, bccAucunNon pris en charge. Envoyez un message distinct à chaque destinataire.
personalizations[].dynamic_template_datato[].variablesValeurs propres à chaque destinataire. Utilisez les variables de premier niveau pour les valeurs communes à tous les destinataires.
subjectsubjectObligatoire, sauf si vous utilisez un modèle.
content[] (text/html)htmlContent
content[] (text/plain)textContent
template_idtemplateIdRecréez d’abord le modèle dans Mail.Land ; l’identifiant change.
reply_to.emailreplyToUne simple chaîne contenant l’adresse.
categories, custom_argstagsLes tags apparaissent dans les statistiques et dans les événements de webhook.
headerscustomHeaders
attachments[].content, filename, typeattachments[].content, fileName, contentTypeContenu encodé en Base64. Jusqu’à 10 pièces jointes et 10 Mio au total.
attachments[].disposition, content_idattachments[].inline, contentIdinline: true pour une image intégrée.
send_at (horodatage Unix, jusqu’à 72 heures à l’avance)scheduledAt (date et heure UTC, jusqu’à 7 jours à l’avance)
tracking_settings (open, click)tracking.opens, tracking.clicksPour les ouvertures, les paramètres de suivi propres au domaine prévalent.
asm.group_idAucun dans l’appel d’envoiLes désabonnements marketing sont gérés par les listes et les campagnes de Mail.Land. Importez les désabonnements de groupe existants (voir ci-dessous).
Aucun équivalentEn-tête X-Idempotency-KeyPendant la période de conservation, une nouvelle tentative avec la même clé renvoie la réponse d’origine au lieu d’envoyer à nouveau.

Les deux API répondent 202 Accepted. Le corps de la réponse de Mail.Land comprend un jobId, un identifiant de message par destinataire, ainsi que les listes des destinataires acceptés et refusés.

Documentation de l’API REST

Importez d’abord vos listes de suppression

Importez-les avant votre premier envoi via Mail.Land, afin que les personnes qui se sont désabonnées ou ont déposé une plainte restent exclues des envois dès le départ. Exportez chaque liste depuis SendGrid au format CSV, puis importez-la avec le type et la portée correspondants, dans le tableau de bord ou avec POST /v1/transactional/suppressions/import.

Importez d’abord vos listes de suppression
Liste SendGridType Mail.LandPortée
Rebonds (Bounces)HardBounceGlobal
Signalements de spam (Spam reports)ComplaintGlobal
Adresses non valides (Invalid emails)InvalidGlobal
Désabonnements globaux (Global unsubscribes)UnsubscribeGlobal
Désabonnements de groupe (Group unsubscribes)UnsubscribeList, pour la liste de diffusion Mail.Land correspondante ; Marketing bloque tous les e-mails marketing

Les blocages (blocks) SendGrid sont généralement des refus temporaires. Examinez-les avant de les importer plutôt que de tous les supprimer.

Documentation des suppressions

Redirigez 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 votre webhook. Les noms d’événements diffèrent de ceux de SendGrid ; mettez donc à jour votre gestionnaire :

Redirigez vos webhooks vers Mail.Land
Événement SendGridÉvénement Mail.Land
deliveredmessage.delivered
deferredmessage.deferred
bouncemessage.bounced
open, clickPas encore disponible
spamreportmessage.complained
unsubscribemessage.unsubscribed

Dédoublonnez à partir du champ event_id : une livraison relancée porte le même identifiant d’événement. Les événements open et click de SendGrid n’ont pas aujourd’hui de webhook équivalent chez Mail.Land : les événements d’ouverture et de clic figurent au catalogue mais ne sont pas envoyés.

Vérification de la signature des webhooks

Basculez étape par étape

  1. Ajoutez et vérifiez votre domaine d’envoi dans Mail.Land. Conservez vos enregistrements SendGrid : ajoutez include:spf.mlnd.net à votre enregistrement SPF existant au lieu d’en créer un second, et conservez un seul enregistrement DMARC.
  2. Importez vos listes de suppression.
  3. Créez une clé sandbox configurée en mode journalisation seule, et exécutez vos tests d’intégration sur Mail.Land sans livrer d’e-mails.
  4. Envoyez de vrais messages à des adresses que vous contrôlez et vérifiez-les dans le journal des e-mails.
  5. Transférez une application ou une petite partie du trafic, puis surveillez la livraison, les rebonds et les plaintes.
  6. Tant que les deux fournisseurs fonctionnent, copiez vers Mail.Land les nouveaux désabonnements, plaintes et rebonds de SendGrid, et effectuez une synchronisation finale avant de basculer le reste du trafic.
  7. Transférez le reste et gardez SendGrid actif jusqu’à ce que ses derniers messages programmés et relancés soient partis.

Questions fréquentes

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

Oui. La vérification d’un domaine dans Mail.Land n’empêche pas SendGrid de continuer à envoyer pour ce domaine : vous pouvez utiliser les deux et transférer le trafic progressivement.

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

Pas dans l’appel d’envoi. Envoyez plutôt un message distinct à chaque destinataire.

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

Pas encore. La documentation propose des exemples prêts à copier pour l’API REST dans huit langages, et toute bibliothèque SMTP fonctionne avec le relais.

Que deviennent mes groupes de désabonnement ?

Importez les désabonnements de chaque groupe avec la portée List pour la liste de diffusion Mail.Land correspondante, et envoyez à cette liste afin que la préférence s’applique. La portée Marketing est la solution de repli plus large : elle bloque tous les e-mails marketing vers cette adresse.

Prêt à quitter SendGrid ?

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.