Envoyer un mail avec NodeMailer

1. Introduction

Pour envoyer un mail avec JavaScript côté serveur, il suffit d'utiliser un langage comme Node.js capable de communiquer avec un serveur SMTP. Une des solutions les plus simples et efficaces pour cela est Nodemailer, un module léger et très populaire, sans dépendances externes.


Avant de commencer, assures-toi d'avoir :

  • Node.js installé sur ton ordinateur (version 14+ recommandée)
  • Un compte sur un service SMTP

Tu peux te servir de ce tutoriel pour le service SMTP.

2. Installation

Dans le terminal dans ton projet, lance la commande :

npm install nodemailer dotenv

dotenv va te permettre de gérer tes idenifiants de manière sécurisée.

Crées ensuite le fichier .env avec les données suivantes :

SMTP_HOST=smtp.servicesmtp.com
SMTP_PORT=port
SMTP_USER=nom_utilisateur
SMTP_PASS=mot_de_passe

Tu dois adapter les infos selon le service SMTP que tu utilises. Si tu utilises ES Modules, tu peux aussi ajouter :"type": "module" dans ton package.json.

3. Configurer Nodemailer

Si tu utilises un projet existant, tu as déjà un fichier index.js. Dans ce fichier, tu dois importer nodemailer et l'utiliser comme suit :


const nodemailer = require("nodemailer");
require("dotenv").config();

async function main() {
  // Création du transporteur SMTP
  const transporter = nodemailer.createTransport({
    host: process.env.SMTP_HOST,
    port: process.env.SMTP_PORT,
    auth: {
      user: process.env.SMTP_USER,
      pass: process.env.SMTP_PASS
    }
  });

  // Définition du contenu de l'email
  const mailOptions = {
    from: '"Flowzy Support" <support@flowzy.app>',
    to: "destinataire@example.com",
    subject: "Hello depuis Node.js",
    text: "Bonjour ! Ceci est un email envoyé avec Node.js et Nodemailer.",
    html: "<p>Bonjour !<br/>Ceci est un <b>email</b> envoyé avec <i>Node.js</i> et <b>Nodemailer</b>.</p>"
  };

  // Envoi
  try {
    const info = await transporter.sendMail(mailOptions);
    console.log("Email envoyé :", info.messageId);
  } catch (error) {
    console.error("Erreur lors de l'envoi :", error);
  }
}

main();                                      
    

4. Lancer l'envoi de mail

Dans ton terminal, lance la commande:

node index.js

Tu devrais voir dans la console :

Email envoyé : <avec l'identifiant_unique>

et tu recevras un email dans ta boîte de test.

5. Exemple dans un formulaire

Dans ton fichier index.js :


import nodemailer from 'nodemailer';

export default async function handler(req, res) {
  if (req.method !== 'POST') return res.status(405).end();

  const { name, email, message } = req.body;

  const transporter = nodemailer.createTransport({
    host: 'smtp.mailtrap.io',
    port: 2525,
    auth: {
      user: 'VOTRE_UTILISATEUR',
      pass: 'VOTRE_MOT_DE_PASSE'
    }
  });

  try {
    await transporter.sendMail({
      from: email,
      to: 'votre@adresse.com',
      subject: `Message de ${name}`,
      text: message,
    });

    res.status(200).json({ success: true });
  } catch (error) {
    console.error(error);
    res.status(500).json({ success: false, message: error.message });
  }
};

Ensuite, crée une page contact.js avec un formulaire :


import { useState } from 'react';

export default function ContactForm() {
  const [form, setForm] = useState({ name: '', email: '', message: '' });
  const [status, setStatus] = useState('');

  const handleChange = (e) => {
    setForm({ ...form, [e.target.name]: e.target.value });
  };

  const handleSubmit = async (e) => {
    e.preventDefault();
    setStatus('Envoi en cours...');

    const res = await fetch('/api/contact', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(form)
    });

    const data = await res.json();
    setStatus(data.success ? 'Message envoyé' : 'Erreur');
  };

  return (
    <form onSubmit={handleSubmit} className="space-y-4">
      <input
        type="text"
        name="name"
        placeholder="Votre nom"
        onChange={handleChange}
        required
        className="w-full p-2 rounded"
      />
      <input
        type="email"
        name="email"
        placeholder="Votre email"
        onChange={handleChange}
        required
        className="w-full p-2 rounded"
      />
      <textarea
        name="message"
        placeholder="Votre message"
        rows="5"
        onChange={handleChange}
        required
        className="w-full p-2 rounded"
      />
      <button type="submit" className="bg-blue-600 text-white px-4 py-2 rounded">
        Envoyer
      </button>
      <p>{status}</p>
    </form>
  );
}

6. Personnalisation et mise en production

  • Personnalise le to, subject et html pour envoyer des confirmations de commandes, des formulaires de contact, etc.
  • Utilise un service SMTP en production Gmail, SendGrid, Mailgun, Mailtrap, etc.

7. Bonnes pratiques

  • Utiliser .env te permettra de cacher tes identifiants
  • Ne pas exposer tes infos SMTP côté client pour plus de sécurité
  • Valider les champs du formulaire côté serveur pour plus de sécurité
  • Gérer les erreurs d’envoi proprement te permettra d'identifier rapidement la source de ton erreur.

Conclusion

Avec seulement quelques lignes de code, tu peux envoyer des mails grâce à Node.js et Nodemailer !

← Retour au blog← Retourner à la série