SMTP pour Node.js — le courrier de votre application qui arrive
Node.js n'a pas de fonction mail intégrée ; presque toutes les applications utilisent Nodemailer pour cela. Cette bibliothèque simplifie l'envoi, mais ne dit rien de la délivrabilité : celle-ci dépend entièrement du serveur SMTP par lequel vous envoyez.
Nodemailer fonctionne avec un transport. Vous créez un transport SMTP avec les données de votre relais — hôte, port, chiffrement et identifiant — et le reste de votre code demeure inchangé. Ce qui part aujourd'hui via un serveur local ou un compte de test passe demain par 2mail.
Pourquoi cela coince sans relais
Une application Node.js envoie typiquement des e-mails au moment où cela compte : un code de vérification, une réinitialisation de mot de passe, une confirmation de réservation. Ce sont des messages attendus en quelques secondes. S'ils partent d'un serveur sans réputation, une partie n'arrive pas ou arrive trop tard — et l'utilisateur clique sur « renvoyer » jusqu'à abandonner.
Configurer le SMTP dans Node.js
Récupérer les données
Connectez-vous à votre compte 2mail et récupérez-y votre serveur SMTP, votre nom d'utilisateur et votre mot de passe.
Compléter dans Node.js
Créez un transport SMTP dans Nodemailer. Indiquez comme hôte le serveur SMTP de 2mail et comme port 587, et désactivez l'option secure afin que la connexion soit mise à niveau via STARTTLS. Sous auth, renseignez le nom d'utilisateur et le mot de passe de votre identifiant 2mail. Lisez ces données depuis des variables d'environnement, pas depuis le code. Nodemailer dispose d'une méthode verify pour contrôler la connexion avant d'envoyer le premier vrai message — utilisez-la.
Authentifier le domaine
Veillez à ce que SPF, DKIM et DMARC soient correctement configurés pour votre domaine, afin que les destinataires puissent vérifier que le courrier vient bien de vous.
Tester
Depuis votre plateforme, envoyez un message de test vers une adresse chez un grand fournisseur et vérifiez qu'il arrive dans la boîte de réception et non dans les indésirables.
Les champs que Node.js demande
Chaque plateforme les nomme un peu différemment, mais il s'agit toujours des mêmes cinq champs. Les valeurs concrètes sont liées à votre compte et se trouvent dans votre compte 2mail — relevez-les à cet endroit, afin d'être certain d'utiliser les bonnes.
| Champ | Ce que vous indiquez |
|---|---|
| Serveur SMTP (host) | Le nom de serveur figurant dans votre compte 2mail. |
| Port | Le port correspondant au chiffrement que vous avez choisi ; votre compte indique lequel. |
| Chiffrement | TLS. N'envoyez jamais sans chiffrement — vos identifiants circuleraient sinon en clair sur le réseau. |
| Nom d'utilisateur | L'identifiant SMTP de votre compte 2mail. |
| Mot de passe | Le mot de passe correspondant. N'utilisez jamais le mot de passe de la boîte aux lettres d'un collaborateur. |
Configuration SMTP pour Node.js dans le code
Des exemples fonctionnels pour le port 587 avec STARTTLS, prêts à être repris. Remplacez l'adresse d'expéditeur par une adresse de votre propre domaine et vérifiez le nom du serveur et l'identifiant dans votre compte 2mail. Le mot de passe a sa place dans une variable d'environnement — jamais dans le code et jamais dans le gestionnaire de versions.
Nodemailer : createTransport pour le port 587
Un seul transport, créé au démarrage et réutilisé partout. La combinaison de secure: false et de requireTLS: true est la bonne pour le port 587 : la connexion démarre en clair, passe en TLS via STARTTLS, et Nodemailer refuse de poursuivre si cette mise à niveau échoue. L'identifiant et le mot de passe proviennent de variables d'environnement.
// mailer.js
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'relay.2mail.eu',
port: 587,
secure: false, // 587 starts plain and upgrades with STARTTLS; true is for port 465 only
requireTLS: true, // refuse to continue if the upgrade to TLS fails
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
});
module.exports = transporter; Tester la connexion avec verify() et un premier e-mail
verify() parcourt toute la procédure d'identification sans rien envoyer et lève une erreur dont le code vous indique la cause — voir le tableau des messages d'erreur plus bas. Lors de l'envoi réel, journalisez le messageId et la réponse du serveur : c'est votre preuve que le relais a accepté le message.
const transporter = require('./mailer');
async function main() {
// Checks DNS, port, TLS and login without sending anything.
await transporter.verify();
const info = await transporter.sendMail({
from: '"Example" <noreply@example.com>',
to: 'you@example.org',
subject: 'SMTP test',
text: 'Sent through the 2mail SMTP relay.',
});
console.log(info.messageId, info.response);
}
main().catch((err) => {
console.error(err.code, err.message);
process.exit(1);
}); Volumes importants : mutualiser les connexions
Si votre application envoie par rafales — une tournée de rappels, une série de notifications — laissez Nodemailer garder un petit nombre de connexions ouvertes au lieu d'en établir une nouvelle par message. C'est plus rapide et, aux yeux du relais, cela ne ressemble pas à un abus.
const transporter = nodemailer.createTransport({
pool: true, // keep connections open and reuse them
maxConnections: 3,
maxMessages: 100, // per connection, then reconnect
host: 'relay.2mail.eu',
port: 587,
secure: false,
requireTLS: true,
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
}); Les e-mails que Node.js envoie
Dès que le relais est configuré, tous ces messages passent par 2mail — vous ne devez pas les configurer un par un.
Pièges avec Node.js
secure et port doivent correspondre
L'option secure ne signifie pas « sûr ou non sûr », mais « TLS dès le premier octet ». Sur le port 587, secure doit être désactivé — STARTTLS suit ensuite. Si vous l'activez malgré tout, la connexion reste bloquée ou est aussitôt coupée, sans erreur claire.
Un seul transport, réutilisé
Créez le transport une seule fois au démarrage et réutilisez-le, au lieu d'en créer un nouveau par message. Lors d'un pic — une tournée de rappels, une campagne — vous ouvrez sinon des centaines de connexions à la fois, ce qu'un relais peut interpréter comme un abus. Nodemailer sait mutualiser les connexions ; activez-le pour les volumes importants.
Attendez le résultat et journalisez-le
L'envoi est asynchrone. Qui n'attend pas la réponse du serveur ou ne la journalise pas ne verra jamais qu'un message a été refusé. Journalisez au minimum l'identifiant du message et l'éventuel refus, et connectez de préférence les webhooks de 2mail pour la livraison et les bounces, afin de voir aussi ce qui échoue après la remise.
Messages d'erreur fréquents avec Node.js
Les messages qui s'affichent lorsque l'hôte, le port, le chiffrement ou l'identifiant sont incorrects — cités tels quels, pour que vous les reconnaissiez dans votre journal, avec la cause et la solution en regard.
| Message | Cause | Solution |
|---|---|---|
Error: connect ECONNREFUSED 127.0.0.1:587 | Nodemailer se connecte à votre propre machine au lieu du relais. L'option host est vide ou undefined — typiquement une variable d'environnement qui n'existe pas en production — et Nodemailer retombe alors sur localhost. | Journalisez les options juste avant createTransport et vérifiez que host contient réellement relay.2mail.eu. |
Error: Connection timeout | Le relais ne répond pas (err.code vaut ETIMEDOUT). Le trafic sortant sur le port 587 est arrêté par le pare-feu de votre hébergeur, de votre conteneur ou de votre plateforme cloud. | Testez depuis la même machine avec openssl s_client -starttls smtp -connect relay.2mail.eu:587 et faites ouvrir le port 587 en sortie. |
Error: Invalid login: 535 5.7.8 Error: authentication failed | Le relais refuse l'identifiant (err.code vaut EAUTH) : un nom d'utilisateur ou un mot de passe erroné, ou une variable d'environnement vide, si bien que Nodemailer s'identifie sans identifiant ou avec un identifiant vide. | Vérifiez SMTP_USERNAME et SMTP_PASSWORD dans l'environnement où le processus s'exécute, et utilisez l'identifiant SMTP de votre compte 2mail — pas le mot de passe d'une boîte aux lettres. |
Error: …:SSL routines:ssl3_get_record:wrong version number | secure: true sur le port 587. Nodemailer entame alors d'emblée une négociation TLS, alors que le relais attend d'abord du SMTP en clair sur ce port et ne bascule qu'après STARTTLS. | Indiquez secure: false et requireTLS: true. La connexion est tout aussi bien chiffrée. |
Error: self signed certificate | Ce n'est pas le relais mais un intermédiaire qui présente le certificat : un proxy d'entreprise ou un antivirus qui intercepte le TLS, ou un serveur de test local vers lequel host pointe encore. | Corrigez le chemin plutôt que de désactiver le contrôle. tls: { rejectUnauthorized: false } fait disparaître l'erreur, mais envoie votre identifiant à quiconque se fait passer pour le relais. |
Une autre plateforme ?
SMTP est un protocole standard : tout système qui parle SMTP — un CRM, un ERP, une application maison ou un serveur — peut envoyer via 2mail avec les mêmes cinq champs.