Tutoriel 7 min de lecture Mis à jour avril 2026

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',
});
Ces exemples utilisent l'API d'Emitlo. Inscrivez-vous gratuitement pour suivre →

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

Questions fréquentes

Quelle est la meilleure façon d'envoyer des emails transactionnels en Node.js ?
Pour les nouveaux projets, utilisez une API REST (comme celle d'Emitlo) avec l'API fetch native ou axios. Pour les projets existants utilisant Nodemailer, configurez-le avec les identifiants SMTP d'Emitlo. L'approche API REST offre une meilleure gestion des erreurs et des réponses structurées.
Devrais-je utiliser Nodemailer ou une API REST pour les emails transactionnels ?
Les deux fonctionnent bien. Nodemailer + SMTP est plus facile à intégrer dans les codebases existants. L'API REST offre une meilleure gestion des erreurs, des réponses structurées et est préférée pour les nouvelles applications. Emitlo supporte les deux avec les mêmes identifiants et limites de débit.
Comment gérer les erreurs d'email en Node.js ?
Enveloppez toujours l'envoi d'emails dans un try/catch. Vérifiez le code de statut HTTP pour les appels API REST (200 = succès, 4xx = erreur client, 5xx = erreur serveur). Pour SMTP, Nodemailer lance des erreurs pour les échecs de connexion et les messages rejetés. Journalisez les erreurs avec suffisamment de contexte pour déboguer (destinataire, sujet, message d'erreur).
Comment envoyer un email HTML en Node.js ?
Passez votre chaîne HTML comme propriété html dans le corps de la requête (API REST) ou l'option html dans Nodemailer. Incluez toujours une alternative en texte brut (propriété text) pour les clients de messagerie qui ne rendent pas le HTML.
Comment envoyer un email avec des pièces jointes en Node.js ?
Avec l'API REST d'Emitlo, incluez un tableau attachments dans le corps de la requête avec le contenu du fichier encodé en base64. Avec Nodemailer, utilisez l'option attachments avec path, content ou buffer. Le plan gratuit d'Emitlo supporte les pièces jointes jusqu'à 10 Mo.

Guides connexes :