Produit

Comment mettre en place le double opt-in via l’API de Mailjet (sécurisé, prêt pour le RGPD)

Cet article de blog vous montrera comment créer un formulaire d'abonnement double opt-in ou lier un formulaire existant avec Mailjet via l'API de Mailjet.
Image pourComment mettre en place le double opt-in via l’API de Mailjet (sécurisé, prêt pour le RGPD)
mars 14, 2019

Ce guide complet vous guidera dans la création d’un flux d’abonnement double opt-in (DOI) sécurisé et évolutif à l’aide de l’API Email de Mailjet v3.1.

Vous apprendrez à mettre en œuvre des liens de confirmation signés, des modèles d’emails, des webhooks et la synchronisation des contacts pour créer un système d’abonnement conforme au RGPD qui améliore la délivrabilité et l’engagement des utilisateurs.

Qu’est-ce que le double opt-in et pourquoi est-il important ?

Le double opt-in est un processus d’abonnement en deux étapes au cours duquel les utilisateurs soumettent d’abord votre formulaire, puis confirment leur abonnement au moyen d’un lien envoyé dans leur boîte de réception électronique. Ce n’est qu’après cette confirmation qu’ils sont ajoutés à votre liste de contacts.

Principaux avantages du double opt-in

  • Meilleure délivrabilité : supprime les fautes de frappe, les robots et les comptes de rôle avant qu’ils n’affectent votre réputation d’expéditeur
  • Taux de plaintes plus faibles : seuls les abonnés activement confirmés reçoivent des emails, ce qui réduit les rapports de spam
  • Une trace claire du consentement : fournit des horodatages, des adresses IP et des jetons comme preuve du consentement
  • Un meilleur engagement : les abonnés confirmés affichent généralement des taux d’ouverture et de clics beaucoup plus élevés

Comparaison entre l’opt-in simple et l’opt-in double

ApprocheÉtapesVolume d’inscriptionsQualitéConformité
Opt-In simpleUne étapeDavantageMoins (fautes de frappe, bots)Basique
Double opt-InDeux étapesMoinsBeaucoup plusPrêt pour le RGPD

Ce que vous allez concevoir

À la fin de ce guide, vous aurez mis en œuvre :

  • Mailjet Send API v3.1 pour les emails de confirmation et de bienvenue
  • Contact et ressources de listes Mailjet pour la gestion des abonnés
  • API des événements Mailjet (webhooks) pour un suivi en temps réel
  • Confirmation sécurisée par jeton avec protection contre les attaques par rejeu

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Compte Mailjet avec clé API et secret pour l’authentification de base
  • Expéditeur/domaine vérifié pour votre adresse « De : »
  • ID de liste de contacts Mailjet pour les abonnés confirmés
  • Modèle d’email de confirmation (via l’API de modèles) ou contenu en ligne
  • Points de terminaison serveur pour créer/vérifier les jetons et gérer les confirmations
  • Facultatif : validations email Mailjet pour la validation des formulaires

Aperçu de l’architecture

Voici comment fonctionne le flux de double opt-in :

  1. L’utilisateur soumet le formulaire d’inscription (email + propriétés optionnelles)
  2. Le serveur crée un jeton signé à usage unique et construit une URL de confirmation
  3. Email de confirmation envoyé via Send API v3.1 avec le lien de confirmation
  4. L’utilisateur clique sur le lien de confirmation
  5. Le serveur vérifie le jeton et inscrit le contact à la liste Mailjet
  6. Envoi facultatif d’un email de bienvenue et configuration de webhooks pour un suivi continu

Mise en œuvre étape par étape du double opt-in

Voici un guide étape par étape pour l’utilisation de l’email API de Mailjet.

Étape 1 : Capturez l’abonnement

Commencez par valider et stocker la demande d’abonnement initiale :

  • Validez le format de l’email côté serveur à l’aide d’une regex standard ou de bibliothèques de validation
  • Facultatif : appelez l’API de validation des emails de Mailjet pour détecter les erreurs évidentes
  • Stockez l’enregistrement en attente dans votre base de données avec statut=pending et l’horodatage
                            

                                // Exemple de validation
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
  return { error: 'Format d'email non valide' };
}

// Stocker l'abonnement en attente
await db.subscriptions.create({
  email: email,
  status: 'pending',
  created_at: new Date(),
  ip_address: req.ip
});
                            
                        

Étape 2 : Créez un lien de confirmation sécurisé

La sécurité est essentielle ; n’utilisez jamais MD5 ou de simples hachages. Au lieu de cela, mettez en place une sécurité adéquate pour les jetons :

Exigences en matière de jetons

  • Expiration de courte durée (30-60 minutes)
  • Usage unique avec protection contre les attaques par rejeu
  • Signé cryptographiquement (HMAC-SHA256 ou JWT)
  • Inclure les revendications : email, issued_at, expires_at, nonce/jti

Exemple de création de jeton

                            

                                const jwt = require('jsonwebtoken');
const crypto = require('crypto');

function createConfirmationToken(email) {
  const nonce = crypto.randomBytes(16).toString('hex');
  const payload = {
  email: email,
  nonce: nonce,
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + (60 * 60) // 1 hour
  };

  return jwt.sign(payload, process.env.JWT_SECRET);
}

const token = createConfirmationToken('user@example.com');
const confirmUrl = `https://yourapp.com/confirm?token=${token}`;
                            
                        

Étape 3 : Envoyez l’email de confirmation

Utilisez Send API Mailjet v3.1 pour envoyer l’email de confirmation. Deux possibilités s’offrent à vous :

Option A : Utilisation d’un modèle stocké (recommandé)

Créez d’abord votre modèle dans Mailjet, puis envoyez-le :

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3.1/send \
  -H 'Content-Type: application/json' \
  -d '{
  "Messages":[
 {
  "From":{"Email":"no-reply@yourdomain.com","Name":"Votre marque"},
  "To":[{"Email":"recipient@example.com","Name":"Destinataire"}],
  "TemplateID": 123456,
  "TemplateLanguage": true,
  "Subject": "Veuillez confirmer votre abonnement",
  "Variables": {
  "confirm_url": "https://yourapp.com/confirm?token=...signed...",
  "first_name": "Alex"
 }
 }
  ]
  }'

                            
                        

Option B : contenu en ligne (pas de modèle)

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3.1/send \
  -H 'Content-Type: application/json' \
  -d '{
  "Messages":[
 {
  "From":{"Email":"no-reply@yourdomain.com","Name":"Votre marque"},
  "To":[{"Email":"recipient@example.com"}],
  "Subject":"Confirmez votre abonnement",
  "TextPart":"Tapez pour confirmer : {{var:confirm_url}}",
  "HTMLPart":"<p>Nous y sommes presque ! <a href="%5C%22%7B%7Bvar:confirm_url%7D%7D%5C%22">Confirmez votre abonnement</a>.</p>",
  "TemplateLanguage": true,
  "Variables":{"confirm_url":"https://yourapp.com/confirm?token=..."}
 }
  ]
  }'
                            
                        

Étape 4 : Traitez les clics de confirmation

Votre point de terminaison de confirmation doit vérifier les jetons de manière sécurisée :

                            

                                app.get('/confirm', async (req, res) => {
  const { token } = req.query;

  try {
  // Vérifier la signature et l'expiration du jeton
  const decoded = jwt.verify(token, process.env.JWT_SECRET);

  // Vérifier si le jeton a déjà été utilisé
  const existingUse = await db.used_tokens.findOne({  
  token_hash: crypto.createHash('sha256').update(token).digest('hex')  
  });

  if (existingUse) {
  return res.status(400).send('Jeton déjà utilisé");
 }

  // Marquer le jeton comme utilisé
  await db.used_tokens.create({
  token_hash: crypto.createHash('sha256').update(token).digest('hex'),
  used_at: new Date()
  });

  // Procéder à l'abonnement
  await subscribeToMailjet(decoded.email);

  res.send('Abonnement confirmé !');

  } catch (error) {
  res.status(400).send('Lien de confirmation non valide ou expiré");
 }
});
                            
                        

Étape 5 : Abonnez à la liste Mailjet

Une fois le jeton vérifié, ajoutez le contact à votre liste Mailjet :

Créer ou mettre à jour un contact

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/contact \
  -H 'Content-Type: application/json' \
  -d '{
  "Email":"recipient@example.com",
  "Nom":"Nom du bénéficiaire"
  }'

                            
                        

Ajouter à la liste

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/listrecipient \
  -H 'Content-Type: application/json' \
  -d '{
  "ContactAlt":"recipient@example.com",
  "ListID": 123456
  }'

                            
                        

Enregistrer les propriétés du contact

                            

                                curl -s -X PUT \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/contactdata/recipient@example.com \
  -H 'Content-Type: application/json' \
  -d '{
  "Data":[
  {"Name":"first_name","Value":"Alex"},
  {"Name":"city","Value":"Austin"}
  ]
  }'
                            
                        

Note : définissez d’abord les propriétés de contact personnalisées en utilisant le point de terminaison contactmetadata si elles n’existent pas déjà.

Étape 6 : Envoyez un email de bienvenue (facultatif)

Une fois l’inscription réussie, envoyez un email de bienvenue en utilisant le même modèle Send API v3.1 que celui de l’étape 3.

Étape 7 : Configurez les webhooks pour le suivi des événements

Mettez en place des webhooks pour recevoir des événements en temps réel afin d’assurer l’hygiène de la liste :

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/eventcallbackurl \
  -H 'Content-Type: application/json' \
  -d '{
  "EventType": "sent",
  "Url": "https://yourapp.com/webhooks/mailjet"
  }'
                            
                        

Suivez ces événements :

  • envoyé, ouvert, cliqué pour les statistiques d’engagement
  • rebond, bloqué, spam pour les problèmes de délivrabilité
  • désabonné pour la conformité et la maintenance de la liste

Bonnes pratiques en matière de sécurité et de conformité

Voici quelques-unes des bonnes pratiques les plus courantes.

Enregistrement des données pour la conformité

Conservez les informations suivantes pour vous conformer au RGPD :

  • Horodatage de la soumission du formulaire et adresse IP
  • Chaîne user agent
  • Adresse email saisie
  • Horodatage de la confirmation et adresse IP
  • ID du jeton utilisé (jamais le jeton brut)

Recommandations en matière de sécurité

  • Ne jamais utiliser MD5 — Utiliser HMAC-SHA256 ou JWT avec une expiration appropriée
  • Mettre en place le rate limiting pour empêcher les inscriptions automatiques
  • Ajouter un CAPTCHA pour une protection supplémentaire contre les robots
  • Vérifier votre domaine avec les enregistrements SPF/DKIM pour une meilleure délivrabilité
  • Stocker uniquement les hachages de jetons — ne jamais enregistrer les jetons bruts

Résolution de problèmes et FAQ

Vous avez d’autres questions sur ce processus ? Consultez notre FAQ.

Puis-je renvoyer les emails de confirmation ?

Oui. Créez un point de terminaison « resend » qui invalide l’ancien jeton et en émet un nouveau avec une nouvelle expiration.

Et si le contact existe déjà ?

Vous pouvez renvoyer les confirmations. En cas de clic, utilisez le point de terminaison listrecipient pour vous assurer qu’ils figurent sur la bonne liste.

Où dois-je placer le jeton, dans une chaîne de requête ou un chemin d’accès ?

La chaîne de requête est typique et plus facile à analyser. Ne jamais enregistrer de jetons bruts dans les statistiques.

Dois-je utiliser l’éditeur de formulaires de Mailjet à la place ?

L’éditeur de formulaires est excellent pour les lancements rapides. Utilisez cette approche API pour des expériences personnalisées à grande échelle.

Ressources complémentaires

Grâce à cette mise en œuvre, vous disposerez d’un système de double opt-in robuste, sécurisé et conforme qui protégera votre réputation d’expéditeur tout en créant une base d’abonnés de grande qualité.

D