Email

Envoyer des e-mails avec Nodemailer

Nodemailer est la bibliothèque standard pour envoyer des e-mails depuis un serveur Node.js. Vous créez un transport pointé vers un serveur SMTP, puis appelez sendMail avec les champs du message. Il gère le pool de connexions, les pièces jointes et les corps HTML. Le code ci-dessous est le minimum nécessaire pour envoyer un vrai message, plus l'astuce de test que la plupart des gens ignorent.

Comment installer et configurer Nodemailer ?

Installez-le depuis npm :

npm install nodemailer

Un transport contient vos paramètres de connexion SMTP. Vous le pointez vers un hôte et un port, puis passez les identifiants sous auth :

import nodemailer from "nodemailer";

const transporter = nodemailer.createTransport({
  host: "smtp.example.com",
  port: 587,
  secure: false, // true for port 465, false for 587 (STARTTLS)
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS,
  },
});

Le port 587 avec secure: false utilise STARTTLS, qui fait passer la connexion en TLS après la négociation. Le port 465 attend secure: true. Conservez le nom d'utilisateur et le mot de passe dans des variables d'environnement, jamais dans le code source.

Comment envoyer un message ?

Appelez sendMail avec l'enveloppe et le contenu. La fonction renvoie une promesse : encapsulez-la dans async/await avec un try/catch pour qu'un envoi échoué ne fasse pas planter le processus :

async function main() {
  try {
    const info = await transporter.sendMail({
      from: '"Your App" <you@yourdomain.com>',
      to: "recipient@example.org",
      subject: "Your receipt",
      text: "Thanks for your order. This is the plain-text version.",
      html: "<p>Thanks for your order.</p>",
    });
    console.log("Sent:", info.messageId);
  } catch (err) {
    console.error("Send failed:", err);
  }
}

main();

Envoyez toujours text et html. Certains clients affichent la version texte brut, et un message sans alternative texte tend à être moins bien noté par les filtres anti-spam.

Comment ajouter des pièces jointes ?

Passez un tableau attachments. Chaque entrée peut lire depuis un chemin, un buffer ou un flux :

await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "recipient@example.org",
  subject: "Your invoice",
  text: "Invoice attached.",
  attachments: [
    {
      filename: "invoice.pdf",
      path: "./invoices/invoice-1042.pdf",
    },
    {
      filename: "note.txt",
      content: "Generated at runtime, no file needed.",
    },
  ],
});

Comment tester sans envoyer de vrai courrier ?

Nodemailer intègre Ethereal, un faux service SMTP qui capture les messages au lieu de les livrer. Vous obtenez une URL d'aperçu pour chaque envoi, idéal pour le développement local :

const testAccount = await nodemailer.createTestAccount();

const transporter = nodemailer.createTransport({
  host: "smtp.ethereal.email",
  port: 587,
  secure: false,
  auth: {
    user: testAccount.user,
    pass: testAccount.pass,
  },
});

const info = await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "test@example.org",
  subject: "Preview only",
  text: "This never leaves Ethereal.",
});

console.log("Preview:", nodemailer.getTestMessageUrl(info));

Ethereal sert à inspecter ce que vous avez construit. Il ne vous dit rien sur l'acceptation du message par une vraie boîte de réception.

Envoyez avec Bird

SMTP fonctionne, mais l'utiliser en production implique d'exploiter un serveur de messagerie (ou d'en louer un), de préchauffer les IP et de surveiller la réputation vous-même. Une HTTP API prend tout cela en charge. Il n'y a pas de socket SMTP à maintenir ouvert, et le fournisseur gère l'infrastructure de délivrabilité. Avec l'Bird e-mail API, le même envoi se résume à un seul appel :

import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.email
  .send({
    from: "you@yourdomain.com",
    to: ["delivered@bird.dev"],
    subject: "Hello from Node",
    html: "<p>It works.</p>",
  })
  .safe();

L'adresse sandbox delivered@bird.dev accepte toujours le courrier : vous pouvez vérifier le câblage avant de pointer vers un vrai destinataire. Les plateformes serverless sont le cas le plus évident pour cette approche, car leurs environnements d'exécution ne peuvent souvent pas maintenir de connexions SMTP ouvertes. Consultez comment envoyer un e-mail sur Vercel pour cette option, et la vue d'ensemble envoyer des e-mails avec JavaScript pour savoir où placer le code e-mail dans votre stack.

FAQ

Nodemailer fonctionne-t-il dans le navigateur ?

Non. Nodemailer est une bibliothèque côté serveur et dépend des modules réseau de Node. Les navigateurs ne peuvent pas ouvrir de connexions SMTP, et placer des identifiants dans le code client les exposerait. Envoyez depuis un backend.

Pourquoi envoyer à la fois du texte et du HTML ?

Un message multipart permet à chaque client de choisir la partie qu'il peut afficher, et l'alternative en texte brut améliore la lecture du message par les filtres anti-spam. Omettre text est une raison courante pour laquelle les e-mails arrivent dans le spam.

Faut-il utiliser SMTP ou une HTTP API ?

SMTP convient pour les faibles volumes et les outils internes. Pour l'envoi en production à grande échelle, une HTTP API supprime le serveur que vous devriez autrement exploiter et intègre la gestion de la délivrabilité. Beaucoup d'équipes utilisent Nodemailer en développement et une API en production.

Nodemailer est un choix solide pour communiquer en SMTP depuis Node. Si vous préférez ne pas exploiter le serveur de messagerie derrière, consultez le guide d'envoi d'e-mails pour voir l'alternative API de bout en bout.

Développez sur le même réseau.

Une clé API de test est disponible immédiatement. La production est activée dès que vous ajoutez un moyen de paiement et vérifiez un expéditeur.

Votre prochaine idée.
Prête à se connecter.