Vous tentez d’envoyer des e‑mails depuis Node.js sur Windows 11 et rencontrez l’erreur ECONNREFUSED ::1:587
? C’est normal : aucun serveur SMTP n’est plus fourni nativement. Ce guide explique pourquoi et propose plusieurs stratégies concrètes pour restaurer l’envoi de courrier depuis votre poste de développement.
Contexte : l’héritage IIS 6.0 disparaît
Pendant deux décennies, les éditions client de Windows incluaient dans les « Fonctionnalités facultatives » le composant IIS 6.0 SMTP Server. Introduit avec Windows Server 2003, il permettait de tester un flux SMTP simple sans recourir à un service externe. Microsoft l’a toutefois déréférencé puis retiré :
- Windows 10 1809 : le rôle subsiste mais caché.
- Windows 11 (toutes éditions) : le rôle n’est plus présent. La recherche
Simple Mail Transfer Protocol (SMTP)
dans services.msc ne renvoie aucun résultat.
Conséquence : tout processus qui tente de se connecter à localhost:25
, localhost:465
ou localhost:587
obtiendra une fermeture immédiate de la socket.
Pourquoi ce retrait ?
Microsoft évoque plusieurs raisons :
- Sécurité : l’ancien service n’était pas compatible SNI ni TLS 1.3 et s’intégrait mal aux nouvelles APIs de chiffrement.
- Maintenance : le code n’était plus activement développé depuis 2005, or la pile SMTP doit suivre l’évolution des RFC (UTF‑8, ARC, MTA‑STS, etc.).
- Usage décroissant : la majorité des développeurs recourent désormais à des services cloud (SendGrid, SES, Mailtrap, etc.).
Impact spécifique sur Node.js et Nodemailer
Nodemailer, par défaut, se comporte comme un client SMTP classique. Si vous écrivez :
const transporter = nodemailer.createTransport({
host: 'localhost',
port: 587
});
le module ouvre une socket TCP vers ::1:587
(IPv6) ou 127.0.0.1:587
(IPv4). Sans service listener, Windows renvoie une erreur ECONNREFUSED
après le handshake SYN. À l’inverse, si vous remplacez localhost
par sandbox.smtp.mailtrap.io
ou un autre hôte distant, la connexion aboutit — preuve que le problème ne vient pas de Nodemailer mais bien de l’absence d’un MTA local.
Solutions détaillées
Approche | Détails pratiques |
---|---|
Utiliser un relais SMTP externe (solution recommandée) | Choisissez un fournisseur : Mailtrap, Gmail SMTP, Outlook, SendGrid, Postmark, SES, etc. Créez des identifiants d’envoi (login, mot de passe, port, hôte). Adaptez votre code :const transporter = nodemailer.createTransport({ host: 'smtp.sendgrid.net', port: 587, secure: false, // STARTTLS auth: { user: 'apikey', pass: process.env.SENDGRID_KEY } }); Activez less secure apps si vous utilisez Gmail personnel (déconseillé en production). Avantage : fiabilité, délivrabilité, conformité SPF/DKIM sans effort. |
Installer un serveur SMTP local alternatif | Trois familles d’outils se distinguent : Outils ultra‑légers : MailHog, Papercut, smtp4dev. Installables par MSI, Chocolately ou conteneur Docker. Idéals pour l’intégration continue. Serveurs Windows natifs : hMailServer, toujours maintenu et open source. Support POP/IMAP/SMTP, authentification TLS complète. Serveurs Unix complets : Postfix, Exim, OpenSMTPD, exécutés via WSL 2. Nécessite quelques commandes apt , un dpkg-reconfigure postfix et l’exposition du port au système hôte (localhost se mappe automatiquement). Après installation : Vérifiez l’écoute :netstat -ano | findstr :25 Testez un handshake :telnet localhost 25 puis EHLO test . Contrôlez l’arrêt/démarrage via services.msc ou sc.exe . |
Activer les fonctionnalités serveur (Windows Server uniquement) | Sur Windows Server 2022/2019, le rôle « IIS 6.0 SMTP Server » subsiste : Lancez Server Manager > Add Roles and Features. Cochez SMTP Server (sous Web Server › IIS 6.0 Management Compatibility). Redémarrez. Un service SMTPSVC apparaît. Attention : ce composant reste obsolète et peu sécurisé. À n’utiliser qu’en réseau interne protégé. |
Stratégies de test hors production | Ethereal.email : Nodemailer génère un compte temporaire à chaque exécution : const testAccount = await nodemailer.createTestAccount(); const transporter = nodemailer.createTransport({ host: testAccount.smtp.host, port: testAccount.smtp.port, secure: testAccount.smtp.secure, auth: testAccount }); Les emails sont consultables via une URL unique. Nodemailer‑stream‑transport : redirige la sortie vers un flux texte local (idéal pour les tests unitaires). En CI : conteneur Docker MailHog avec exposition du port 1025 ; GitHub Actions ou GitLab CI se connectent dessus sans quitter le réseau virtuel. |
Tests et validation
Quelle que soit l’approche retenue, vérifiez l’ouverture de session TLS, l’authentification et la livraison :
- PowerShell
Test-NetConnection -ComputerName smtp.example.com -Port 587
- OpenSSL
openssl s_client -starttls smtp -crlf -connect smtp.example.com:587
- Journal Nodemailer : passez
logger: true
dans l’objetcreateTransport
pour afficher la négociation TLS. - Analyse réseau : Wireshark sur filtre
tcp.port == 25 || 587
permet de confirmer la direction des paquets.
Gestion des ports et pare‑feu
Beaucoup d’utilisateurs découvrent que même un serveur SMTP opérationnel est bloqué en sortie :
- FAI grand public : blocage systématique du port 25 sortant pour limiter le spam.
- Proxy d’entreprise : seuls les ports 80/443 sont ouverts. D’où l’avantage des relais utilisant Message Submission (port 587) ou SMTPS (465).
- Windows Defender Firewall : pensez à autoriser le binaire du serveur SMTP en écoute sur le réseau privé.
Sécurité et conformité
Même pour un environnement de test, respecter les bonnes pratiques réduit les surprises le jour de la mise en production :
Problème | Mesure préventive |
---|---|
Fuite de mails réels vers des boîtes clientes | Redirigez tous les domaines vers *.example.invalid ou utilisez MailHog qui capture sans émettre. |
Informations sensibles dans les logs | Activez le masquage de mot de passe (hideCredentials : true dans Nodemailer). |
Blacklistage IP | N’ouvrez pas le port 25 sur Internet depuis une adresse résidentielle ; passez par un relais authentifié. |
Non‑conformité RGPD | Choisissez un fournisseur SMTP hébergé dans l’UE ou avec clauses contractuelles types. |
FAQ
Pourquoi ping
ne fonctionne‑t‑il pas sur un port ?
ping
ICMP teste la couche réseau 3, pas la couche 4. Utilisez Test-NetConnection
ou tcping.exe
pour vérifier un port.
Puis‑je copier le SMTPSVC d’une ancienne machine ?
Non : le composant dépend d’API système retirées. Sa copie n’enregistrera pas les services correctement et Planificateur de tâches refusera de le démarrer.
Mailtrap ou SendGrid : quel est le meilleur pour du test continu ?
Mailtrap offre un inbox sandbox illimité sans délivrance réelle, idéal pour le test. SendGrid se positionne pour la production avec des quotas gratuits limités. Utilisez l’un puis l’autre selon la phase du projet.
Conclusion
La suppression du service SMTP natif dans Windows 11 n’est pas un bug ; c’est un changement d’orientation. Au lieu d’essayer de restaurer un composant obsolète, privilégiez l’intégration d’un relais moderne ou l’installation d’un outil de capture léger adapté aux workflows DevOps. Cette démarche renforce la sécurité, simplifie la configuration et rapproche votre environnement de test des conditions réelles de production.