SMTP für Node.js — die Post Ihrer Anwendung, die ankommt
Node.js hat keine eingebaute Mailfunktion; fast alle Anwendungen nutzen dafür Nodemailer. Diese Bibliothek vereinfacht den Versand, sagt aber nichts über die Zustellbarkeit: Die hängt vollständig vom SMTP-Server ab, über den Sie senden.
Nodemailer arbeitet mit einem Transport. Sie erstellen einen SMTP-Transport mit den Daten Ihres Relays — Host, Port, Verschlüsselung und Zugangsdaten — und der Rest Ihres Codes bleibt unverändert. Was heute über einen lokalen Server oder ein Testkonto abgeht, läuft morgen über 2mail.
Warum es ohne Relay schiefgeht
Eine Node.js-Anwendung versendet E-Mails typischerweise in dem Moment, in dem es zählt: ein Verifizierungscode, ein Passwort-Zurücksetzen, eine Buchungsbestätigung. Das sind Nachrichten, die innerhalb von Sekunden erwartet werden. Gehen sie von einem Server ohne Reputation ab, kommt ein Teil nicht oder zu spät an — und der Benutzer klickt so lange auf „erneut senden“, bis er aufgibt.
SMTP in Node.js einrichten
Zugangsdaten abrufen
Melden Sie sich in Ihrem 2mail-Konto an und rufen Sie dort Ihren SMTP-Server, Benutzernamen und Ihr Passwort ab.
In Node.js eintragen
Erstellen Sie in Nodemailer einen SMTP-Transport. Geben Sie als Host den SMTP-Server von 2mail und als Port 587 an, und deaktivieren Sie die Option secure, damit die Verbindung über STARTTLS hochgestuft wird. Unter auth tragen Sie Benutzername und Passwort Ihrer 2mail-Zugangsdaten ein. Lesen Sie diese Daten aus Umgebungsvariablen, nicht aus dem Code. Nodemailer hat eine verify-Methode, um die Verbindung vor der ersten echten Nachricht zu prüfen — nutzen Sie sie.
Domain authentifizieren
Sorgen Sie dafür, dass SPF, DKIM und DMARC für Ihre Domain korrekt gesetzt sind, damit Empfänger verifizieren können, dass die Mail von Ihnen stammt.
Testen
Senden Sie von Ihrer Plattform aus eine Testnachricht an eine Adresse bei einem großen Provider und prüfen Sie, ob sie im Posteingang ankommt und nicht im Spam-Ordner.
Die Felder, die Node.js abfragt
Jede Plattform nennt sie etwas anders, aber es geht immer um dieselben fünf. Die konkreten Werte sind kontogebunden und finden Sie in Ihrem 2mail-Konto — rufen Sie sie dort ab, damit Sie sicher die richtigen verwenden.
| Feld | Was Sie eintragen |
|---|---|
| SMTP-Server (Host) | Der Servername aus Ihrem 2mail-Konto. |
| Port | Der Port, der zu Ihrer gewählten Verschlüsselung gehört; Ihr Konto zeigt, welcher. |
| Verschlüsselung | TLS. Senden Sie nie unverschlüsselt — sonst gehen Ihre Zugangsdaten lesbar über die Leitung. |
| Benutzername | Der SMTP-Login Ihres 2mail-Kontos. |
| Passwort | Das zugehörige Passwort. Verwenden Sie nie das Passwort eines Mitarbeiterpostfachs. |
SMTP-Konfiguration für Node.js im Code
Funktionierende Beispiele für Port 587 mit STARTTLS, direkt zum Übernehmen. Ersetzen Sie die Absenderadresse durch eine Adresse auf Ihrer eigenen Domain und prüfen Sie Servername und Login in Ihrem 2mail-Konto. Das Passwort gehört in eine Umgebungsvariable — nie in den Code und nie in die Versionsverwaltung.
Nodemailer: createTransport für Port 587
Ein Transport, beim Start erstellt und überall wiederverwendet. Die Kombination aus secure: false und requireTLS: true ist die richtige für Port 587: Die Verbindung beginnt unverschlüsselt, wird über STARTTLS auf TLS hochgestuft, und Nodemailer weigert sich fortzufahren, wenn diese Hochstufung scheitert. Benutzername und Passwort kommen aus Umgebungsvariablen.
// 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; Verbindung testen mit verify() und einer ersten E-Mail
verify() durchläuft die vollständige Anmeldung, ohne etwas zu senden, und wirft einen Fehler mit einem code, an dem Sie die Ursache erkennen — siehe die Tabelle mit den Fehlermeldungen weiter unten. Protokollieren Sie beim echten Versand die messageId und die Antwort des Servers: Das ist Ihr Beleg dafür, dass das Relay die Nachricht angenommen hat.
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);
}); Größere Volumen: Verbindungen poolen
Versendet Ihre Anwendung in Schüben — eine Erinnerungsrunde, eine Reihe von Benachrichtigungen —, lassen Sie Nodemailer eine kleine Zahl von Verbindungen offen halten, statt für jede Nachricht eine neue aufzubauen. Das ist schneller und sieht für das Relay nicht nach Missbrauch aus.
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,
},
}); Welche Mails Node.js sendet
Sobald das Relay eingerichtet ist, laufen diese alle über 2mail — Sie müssen sie nicht einzeln konfigurieren.
Stolperfallen bei Node.js
secure und Port müssen zusammenpassen
Die Option secure bedeutet nicht „sicher oder unsicher“, sondern „TLS ab dem ersten Byte“. Auf Port 587 muss secure deaktiviert sein — STARTTLS folgt danach. Aktivieren Sie sie trotzdem, bleibt die Verbindung hängen oder wird sofort getrennt, ohne klare Fehlermeldung.
Ein Transport, wiederverwendet
Erstellen Sie den Transport einmal beim Start und verwenden Sie ihn wieder, statt für jede Nachricht einen neuen anzulegen. Bei einer Spitze — ein Mahnlauf, eine Kampagne — öffnen Sie sonst Hunderte Verbindungen gleichzeitig, was ein Relay als Missbrauch werten kann. Nodemailer kann Verbindungen poolen; aktivieren Sie das bei größeren Volumen.
Warten Sie das Ergebnis ab und protokollieren Sie es
Der Versand ist asynchron. Wer die Antwort des Servers nicht abwartet oder nicht protokolliert, sieht nie, dass eine Nachricht abgewiesen wurde. Protokollieren Sie mindestens die Nachrichten-ID und eine eventuelle Ablehnung, und binden Sie am besten die Webhooks von 2mail für Zustellung und Bounces an, damit Sie auch sehen, was nach der Übergabe scheitert.
Häufige Fehlermeldungen bei Node.js
Die Meldungen, die Sie sehen, wenn Host, Port, Verschlüsselung oder Login nicht stimmen — im Wortlaut, damit Sie sie in Ihrem Log wiedererkennen, mit Ursache und Lösung daneben.
| Meldung | Ursache | Lösung |
|---|---|---|
Error: connect ECONNREFUSED 127.0.0.1:587 | Nodemailer verbindet sich mit Ihrem eigenen Rechner statt mit dem Relay. Die Option host ist leer oder undefined — typischerweise eine Umgebungsvariable, die es in der Produktion nicht gibt — und dann fällt Nodemailer auf localhost zurück. | Protokollieren Sie die Optionen unmittelbar vor createTransport und prüfen Sie, ob host tatsächlich relay.2mail.eu enthält. |
Error: Connection timeout | Vom Relay kommt keine Antwort (err.code ist ETIMEDOUT). Ausgehender Verkehr auf Port 587 wird von der Firewall Ihres Hosters, Ihres Containers oder Ihrer Cloud-Plattform aufgehalten. | Testen Sie vom selben Rechner aus mit openssl s_client -starttls smtp -connect relay.2mail.eu:587 und lassen Sie Port 587 für ausgehenden Verkehr freigeben. |
Error: Invalid login: 535 5.7.8 Error: authentication failed | Das Relay lehnt die Anmeldung ab (err.code ist EAUTH): ein falscher Benutzername oder ein falsches Passwort, oder eine leere Umgebungsvariable, sodass sich Nodemailer ohne oder mit leeren Zugangsdaten anmeldet. | Prüfen Sie SMTP_USERNAME und SMTP_PASSWORD in der Umgebung, in der der Prozess läuft, und verwenden Sie den SMTP-Login aus Ihrem 2mail-Konto — nicht das Passwort eines Postfachs. |
Error: …:SSL routines:ssl3_get_record:wrong version number | secure: true auf Port 587. Nodemailer beginnt dann sofort mit einem TLS-Handshake, während das Relay auf diesem Port zuerst gewöhnliches SMTP erwartet und erst nach STARTTLS umschaltet. | Setzen Sie secure: false und requireTLS: true. Die Verbindung ist damit genauso gut verschlüsselt. |
Error: self signed certificate | Nicht das Relay, sondern etwas auf dem Weg dorthin präsentiert das Zertifikat: ein Unternehmens-Proxy oder Virenscanner, der TLS abfängt, oder ein lokaler Testserver, auf den host noch zeigt. | Beheben Sie das Problem auf dem Verbindungsweg, statt die Prüfung abzuschalten. tls: { rejectUnauthorized: false } lässt den Fehler verschwinden, schickt Ihre Zugangsdaten aber an jeden, der sich als Relay ausgibt. |
Andere Plattform?
SMTP ist ein Standardprotokoll: Jedes System, das SMTP spricht — ein CRM, ein ERP, eine eigene Anwendung oder ein Server —, kann über 2mail mit denselben fünf Feldern senden.