SMTP voor Node.js — mail uit uw applicatie die aankomt
Node.js heeft geen ingebouwde mailfunctie; vrijwel elke applicatie gebruikt daarvoor Nodemailer. Die bibliotheek maakt versturen eenvoudig, maar zegt niets over afleverbaarheid: die hangt volledig af van de SMTP-server waarlangs u verstuurt.
Nodemailer werkt met een transport. U maakt een SMTP-transport aan met de gegevens van uw relay — host, poort, versleuteling en login — en de rest van uw code blijft ongewijzigd. Wat vandaag via een lokale server of een testaccount vertrekt, loopt morgen via 2mail.
Waarom het misgaat zonder relay
Een Node.js-applicatie verstuurt typisch mail op het moment dat het ertoe doet: een verificatiecode, een wachtwoordherstel, een bevestiging van een boeking. Dat zijn berichten die binnen enkele seconden verwacht worden. Vertrekken ze vanaf een server zonder reputatie, dan komt een deel er niet of te laat aan — en de gebruiker klikt op "opnieuw versturen" tot hij opgeeft.
SMTP instellen in Node.js
Gegevens ophalen
Log in op uw 2mail-account en haal daar uw SMTP-server, gebruikersnaam en wachtwoord op.
Invullen in Node.js
Maak in Nodemailer een SMTP-transport aan. Geef als host de SMTP-server van 2mail op en als poort 587, en zet de secure-optie uit zodat de verbinding via STARTTLS wordt opgewaardeerd. Vul onder auth de gebruikersnaam en het wachtwoord van uw 2mail-login in. Lees die gegevens uit omgevingsvariabelen, niet uit de code. Nodemailer heeft een verify-methode om de verbinding te controleren voor u de eerste echte mail verstuurt — gebruik die.
Domein authenticeren
Zorg dat SPF, DKIM en DMARC voor uw domein correct staan, zodat ontvangers kunnen verifiëren dat de mail van u komt.
Testen
Verstuur vanuit uw platform een testbericht naar een adres bij een grote provider en controleer of het in de inbox aankomt en niet in de spammap.
De velden die Node.js vraagt
Elk platform noemt ze net iets anders, maar het gaat altijd om dezelfde vijf. De concrete waarden zijn accountgebonden en vindt u in uw 2mail-account — vul ze daar op, zodat u zeker de juiste gebruikt.
| Veld | Wat u invult |
|---|---|
| SMTP-server (host) | De servernaam uit uw 2mail-account. |
| Poort | De poort die bij uw gekozen versleuteling hoort; uw account toont welke. |
| Versleuteling | TLS. Verstuur nooit onversleuteld — uw inloggegevens gaan anders leesbaar over de lijn. |
| Gebruikersnaam | De SMTP-login van uw 2mail-account. |
| Wachtwoord | Het bijbehorende wachtwoord. Gebruik nooit het wachtwoord van een mailbox van een medewerker. |
SMTP-configuratie voor Node.js in code
Werkende voorbeelden voor poort 587 met STARTTLS, klaar om over te nemen. Vervang het afzenderadres door een adres op uw eigen domein en controleer servernaam en login in uw 2mail-account. Het wachtwoord hoort in een omgevingsvariabele — nooit in de code en nooit in versiebeheer.
Nodemailer: createTransport voor poort 587
Eén transport, aangemaakt bij het opstarten en overal hergebruikt. De combinatie secure: false met requireTLS: true is de juiste voor poort 587: de verbinding start gewoon, wordt via STARTTLS naar TLS opgewaardeerd, en Nodemailer weigert verder te gaan wanneer die opwaardering mislukt. Login en wachtwoord komen uit omgevingsvariabelen.
// 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; Verbinding testen met verify() en een eerste mail
verify() doorloopt de volledige aanmelding zonder iets te versturen en gooit een fout met een code waaraan u de oorzaak herkent — zie de tabel met foutmeldingen verderop. Log bij de echte verzending het messageId en het antwoord van de server: dat is uw bewijs dat de relay het bericht heeft aangenomen.
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);
}); Grotere volumes: verbindingen poolen
Verstuurt uw applicatie in pieken — een herinneringsronde, een reeks meldingen — laat Nodemailer dan een klein aantal verbindingen openhouden in plaats van er per bericht een nieuwe op te zetten. Dat is sneller en oogt voor de relay niet als misbruik.
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,
},
}); Welke mails Node.js verstuurt
Zodra de relay ingesteld is, lopen deze allemaal via 2mail — u hoeft ze niet stuk voor stuk te configureren.
Valkuilen bij Node.js
secure en poort moeten bij elkaar passen
De secure-optie betekent niet "veilig of onveilig", maar "TLS vanaf de eerste byte". Op poort 587 hoort secure uit te staan — STARTTLS volgt daarna. Zet u ze toch aan, dan hangt de verbinding of wordt ze meteen afgebroken, zonder duidelijke fout.
Eén transport, hergebruikt
Maak de transport één keer aan bij het opstarten en hergebruik ze, in plaats van per mail een nieuwe op te zetten. Bij een piek — een herinneringsronde, een campagne — opent u anders honderden verbindingen tegelijk, wat een relay als misbruik kan lezen. Nodemailer kan verbindingen poolen; zet dat aan bij grotere volumes.
Wacht op het resultaat en log het
Versturen is asynchroon. Wie het antwoord van de server niet afwacht of niet logt, ziet nooit dat een bericht geweigerd werd. Log minstens het bericht-id en de eventuele weigering, en koppel bij voorkeur de webhooks van 2mail voor aflevering en bounce, zodat u ook ziet wat na de overdracht misloopt.
Veelvoorkomende foutmeldingen bij Node.js
De meldingen die u te zien krijgt wanneer host, poort, versleuteling of login niet kloppen — letterlijk, zodat u ze herkent in uw log, met de oorzaak en de oplossing ernaast.
| Melding | Oorzaak | Oplossing |
|---|---|---|
Error: connect ECONNREFUSED 127.0.0.1:587 | Nodemailer verbindt met uw eigen machine in plaats van met de relay. De host-optie is leeg of undefined — typisch een omgevingsvariabele die in productie niet bestaat — en dan valt Nodemailer terug op localhost. | Log de opties vlak voor createTransport en controleer of host effectief relay.2mail.eu bevat. |
Error: Connection timeout | Er komt geen antwoord van de relay (err.code is ETIMEDOUT). Uitgaand verkeer op poort 587 wordt tegengehouden door de firewall van uw hoster, uw container of uw cloudplatform. | Test vanaf dezelfde machine met openssl s_client -starttls smtp -connect relay.2mail.eu:587 en laat poort 587 uitgaand openzetten. |
Error: Invalid login: 535 5.7.8 Error: authentication failed | De relay weigert de login (err.code is EAUTH): een verkeerde gebruikersnaam of een verkeerd wachtwoord, of een omgevingsvariabele die leeg is, waardoor Nodemailer zonder of met een lege login aanmeldt. | Controleer SMTP_USERNAME en SMTP_PASSWORD in de omgeving waarin het proces draait, en gebruik de SMTP-login uit uw 2mail-account — niet het wachtwoord van een mailbox. |
Error: …:SSL routines:ssl3_get_record:wrong version number | secure: true op poort 587. Nodemailer begint dan meteen met een TLS-handdruk, terwijl de relay op die poort eerst gewone SMTP verwacht en pas na STARTTLS overschakelt. | Zet secure: false en requireTLS: true. De verbinding is daarmee even goed versleuteld. |
Error: self signed certificate | Niet de relay maar iets onderweg presenteert het certificaat: een bedrijfsproxy of antivirus die TLS onderschept, of een lokale testserver waarnaar host nog verwijst. | Los het pad op in plaats van de controle uit te zetten. tls: { rejectUnauthorized: false } laat de fout verdwijnen, maar stuurt uw login naar om het even wie zich als relay voordoet. |
Ander platform?
SMTP is een standaardprotocol: elk systeem dat SMTP spreekt — een CRM, een ERP, een eigen applicatie of een server — kan via 2mail versturen met dezelfde vijf velden.