Envoyer des emails transactionnels avec Node.js (avec exemples de code)
Deux approches : l'API REST d'Emitlo (recommandée pour les nouveaux projets) et Nodemailer + SMTP (pour les codebases existants). Les deux utilisent Emitlo comme infrastructure d'envoi.
Ces exemples utilisent l'API d'Emitlo. Inscrivez-vous gratuitement pour suivre — 12 000 emails/mois, sans carte bancaire.
Méthode 1 : API REST Emitlo (fetch)
L'approche la plus simple — aucune dépendance requise. Fonctionne dans Node.js 18+ avec l'API fetch native.
// envoyer-email.js
const response = await fetch('https://api.emitlo.com/v1/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EMITLO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: '[email protected]',
to: '[email protected]',
subject: 'Bienvenue dans notre application',
html: '<h1>Bienvenue !</h1><p>Merci de vous être inscrit.</p>',
text: 'Bienvenue ! Merci de vous être inscrit.',
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Échec de l'email : ${error.message}`);
}
const result = await response.json();
console.log('Envoyé :', result.id); // msg_8f2c... Méthode 2 : API REST Emitlo (axios)
// npm install axios
const axios = require('axios');
async function envoyerEmail({ to, subject, html, text }) {
const { data } = await axios.post(
'https://api.emitlo.com/v1/messages',
{ from: '[email protected]', to, subject, html, text },
{
headers: {
Authorization: `Bearer ${process.env.EMITLO_API_KEY}`,
},
}
);
return data; // { id: 'msg_8f2c...', status: 'queued' }
}
// Utilisation
await envoyerEmail({
to: '[email protected]',
subject: 'Votre commande est confirmée',
html: '<h1>Commande #1234 confirmée</h1>',
text: 'Commande #1234 confirmée',
}); Méthode 3 : Nodemailer + SMTP
Utilisez cette approche si vous avez un codebase existant utilisant Nodemailer. Mettez simplement à jour les identifiants SMTP pour utiliser Emitlo.
// npm install nodemailer
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'smtp.emitlo.com',
port: 587,
secure: false, // utiliser STARTTLS
auth: {
user: process.env.EMITLO_SMTP_USER,
pass: process.env.EMITLO_SMTP_PASS,
},
});
async function envoyerEmail({ to, subject, html, text }) {
const info = await transporter.sendMail({
from: '"Votre Application" <[email protected]>',
to,
subject,
html,
text,
});
return info.messageId;
}
// Utilisation
await envoyerEmail({
to: '[email protected]',
subject: 'Réinitialisation de mot de passe',
html: '<p>Cliquez <a href="...">ici</a> pour réinitialiser votre mot de passe.</p>',
text: 'Visitez ce lien pour réinitialiser votre mot de passe : ...',
}); Envoyer un email HTML
Incluez toujours les versions HTML et texte brut. Certains clients de messagerie affichent le texte brut par défaut, et les filtres anti-spam recherchent la présence d'une version texte brut.
const emailHtml = `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body style="font-family: sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;">
<h1 style="color: #1a1a2e;">Bienvenue dans Notre Application</h1>
<p>Bonjour ${utilisateur.nom},</p>
<p>Merci de vous être inscrit. Cliquez sur le bouton ci-dessous pour vérifier votre email.</p>
<a href="${urlVerification}"
style="display: inline-block; background: #6c3ff9; color: white;
padding: 12px 24px; border-radius: 8px; text-decoration: none;">
Vérifier l'email
</a>
</body>
</html>
`;
const emailTexte = `
Bienvenue dans Notre Application
Bonjour ${utilisateur.nom},
Merci de vous être inscrit. Visitez ce lien pour vérifier votre email :
${urlVerification}
`; Envoyer avec des pièces jointes
// API REST avec pièce jointe
const fs = require('fs');
const pdfBuffer = fs.readFileSync('./facture.pdf');
await fetch('https://api.emitlo.com/v1/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EMITLO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: '[email protected]',
to: '[email protected]',
subject: 'Votre facture #FAC-1234',
html: '<p>Veuillez trouver votre facture en pièce jointe.</p>',
text: 'Veuillez trouver votre facture en pièce jointe.',
attachments: [{
filename: 'facture-1234.pdf',
content: pdfBuffer.toString('base64'),
contentType: 'application/pdf',
}],
}),
}); Gestion des erreurs
async function envoyerEmailSafe({ to, subject, html, text }) {
try {
const response = await fetch('https://api.emitlo.com/v1/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EMITLO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ from: '[email protected]', to, subject, html, text }),
});
if (response.status === 429) {
// Limite de débit atteinte — réessayer après délai
const retryAfter = response.headers.get('Retry-After') || 60;
throw new Error(`Limite de débit. Réessayer après ${retryAfter}s`);
}
if (!response.ok) {
const error = await response.json();
throw new Error(`Erreur API email ${response.status}: ${error.message}`);
}
return await response.json();
} catch (err) {
// Journaliser l'erreur avec contexte pour le débogage
console.error('Échec d'envoi email', { to, subject, error: err.message });
throw err; // Relancer pour que l'appelant gère
}
} Variables d'environnement
Ne codez jamais les clés API en dur. Utilisez des variables d'environnement :
# .env
EMITLO_API_KEY=votre_cle_api_ici
EMITLO_SMTP_USER=votre_utilisateur_smtp
EMITLO_SMTP_PASS=votre_mot_de_passe_smtp
[email protected] // Charger avec dotenv
require('dotenv').config();
const apiKey = process.env.EMITLO_API_KEY; Commencez à envoyer des emails transactionnels en Node.js — gratuitement
12 000 emails/mois (400/jour) · API REST + SMTP · Sans carte bancaire