Produit
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.
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.
Approche | Étapes | Volume d’inscriptions | Qualité | Conformité |
---|---|---|---|---|
Opt-In simple | Une étape | Davantage | Moins (fautes de frappe, bots) | Basique |
Double opt-In | Deux étapes | Moins | Beaucoup plus | Prêt pour le RGPD |
À la fin de ce guide, vous aurez mis en œuvre :
Avant de commencer, assurez-vous de disposer des éléments suivants :
Voici comment fonctionne le flux de double opt-in :
Voici un guide étape par étape pour l’utilisation de l’email API de Mailjet.
Commencez par valider et stocker la demande d’abonnement initiale :
// 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
});
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 :
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}`;
Utilisez Send API Mailjet v3.1 pour envoyer l’email de confirmation. Deux possibilités s’offrent à vous :
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"
}
}
]
}'
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=..."}
}
]
}'
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é");
}
});
Une fois le jeton vérifié, ajoutez le contact à votre liste Mailjet :
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"
}'
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
}'
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à.
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.
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 :
Voici quelques-unes des bonnes pratiques les plus courantes.
Conservez les informations suivantes pour vous conformer au RGPD :
Vous avez d’autres questions sur ce processus ? Consultez notre FAQ.
Oui. Créez un point de terminaison « resend » qui invalide l’ancien jeton et en émet un nouveau avec une nouvelle expiration.
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.
La chaîne de requête est typique et plus facile à analyser. Ne jamais enregistrer de jetons bruts dans les statistiques.
L’éditeur de formulaires est excellent pour les lancements rapides. Utilisez cette approche API pour des expériences personnalisées à grande échelle.
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é.