Email

E-Mails versenden mit Nodemailer

Nodemailer ist die Standardbibliothek zum Versenden von E-Mails aus einem Node.js-Server. Sie erstellen einen Transport, der auf einen SMTP-Server zeigt, und rufen dann sendMail mit den Nachrichtenfeldern auf. Nodemailer übernimmt Connection Pooling, Anhänge und HTML-Bodys. Der folgende Code ist das Minimum, das Sie für den Versand einer echten Nachricht brauchen, plus der Testtrick, den die meisten übersehen.

Wie installieren und konfigurieren Sie Nodemailer?

Installieren Sie es über npm:

npm install nodemailer

Ein Transport enthält Ihre SMTP-Verbindungsdaten. Sie geben Host und Port an und übergeben die Zugangsdaten unter auth:

import nodemailer from "nodemailer";

const transporter = nodemailer.createTransport({
  host: "smtp.example.com",
  port: 587,
  secure: false, // true for port 465, false for 587 (STARTTLS)
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS,
  },
});

Port 587 mit secure: false nutzt STARTTLS, das die Verbindung nach dem Handshake auf TLS hochstuft. Port 465 erwartet secure: true. Speichern Sie Benutzername und Passwort in Umgebungsvariablen, niemals im Quellcode.

Wie versenden Sie eine Nachricht?

Rufen Sie sendMail mit Envelope und Inhalt auf. Der Aufruf gibt ein Promise zurück, also verpacken Sie ihn in async/await mit einem try/catch, damit ein fehlgeschlagener Versand den Prozess nicht zum Absturz bringt:

async function main() {
  try {
    const info = await transporter.sendMail({
      from: '"Your App" <you@yourdomain.com>',
      to: "recipient@example.org",
      subject: "Your receipt",
      text: "Thanks for your order. This is the plain-text version.",
      html: "<p>Thanks for your order.</p>",
    });
    console.log("Sent:", info.messageId);
  } catch (err) {
    console.error("Send failed:", err);
  }
}

main();

Senden Sie immer sowohl text als auch html. Manche Clients rendern den Klartext-Teil, und eine Nachricht ohne Text-Alternative wird von Spamfiltern tendenziell schlechter bewertet.

Wie fügen Sie Anhänge hinzu?

Übergeben Sie ein attachments-Array. Jeder Eintrag kann aus einem Pfad, einem Buffer oder einem Stream lesen:

await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "recipient@example.org",
  subject: "Your invoice",
  text: "Invoice attached.",
  attachments: [
    {
      filename: "invoice.pdf",
      path: "./invoices/invoice-1042.pdf",
    },
    {
      filename: "note.txt",
      content: "Generated at runtime, no file needed.",
    },
  ],
});

Wie testen Sie ohne echten Mailversand?

Nodemailer wird mit Ethereal ausgeliefert, einem gefälschten SMTP-Dienst, der Nachrichten auffängt, statt sie zuzustellen. Sie erhalten pro Versand eine Vorschau-URL, ideal für die lokale Entwicklung:

const testAccount = await nodemailer.createTestAccount();

const transporter = nodemailer.createTransport({
  host: "smtp.ethereal.email",
  port: 587,
  secure: false,
  auth: {
    user: testAccount.user,
    pass: testAccount.pass,
  },
});

const info = await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "test@example.org",
  subject: "Preview only",
  text: "This never leaves Ethereal.",
});

console.log("Preview:", nodemailer.getTestMessageUrl(info));

Ethereal dient der Prüfung dessen, was Sie gebaut haben. Es sagt Ihnen nichts darüber, ob ein echtes Postfach die Nachricht annehmen würde.

Versand mit Bird

SMTP funktioniert, aber im Produktivbetrieb bedeutet es, einen Mailserver zu betreiben (oder zu mieten), IPs aufzuwärmen und die Reputation selbst zu überwachen. Eine HTTP-API nimmt Ihnen das ab. Es gibt keinen SMTP-Socket, der offen gehalten werden muss, und der Anbieter verwaltet die Zustellinfrastruktur. Mit der Bird-E-Mail-API ist derselbe Versand ein einziger Aufruf:

import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.email
  .send({
    from: "you@yourdomain.com",
    to: ["delivered@bird.dev"],
    subject: "Hello from Node",
    html: "<p>It works.</p>",
  })
  .safe();

Die delivered@bird.dev-Sandbox-Adresse nimmt immer E-Mails an, sodass Sie die Anbindung prüfen können, bevor Sie an einen echten Empfänger senden. Serverless-Plattformen sind der deutlichste Anwendungsfall für diesen Ansatz, da ihre Funktionslaufzeiten oft keine SMTP-Verbindungen offen halten können. Unter E-Mails auf Vercel versenden finden Sie diesen Weg, und die umfassendere Übersicht E-Mails mit JavaScript versenden zeigt, wo E-Mail-Code in Ihren Stack gehört.

FAQ

Funktioniert Nodemailer im Browser?

Nein. Nodemailer ist eine serverseitige Bibliothek und benötigt die Netzwerkmodule von Node. Browser können keine SMTP-Verbindungen öffnen, und Zugangsdaten im Client-Code wären öffentlich sichtbar. Senden Sie stattdessen von einem Backend aus.

Warum sowohl Text als auch HTML senden?

Eine Multipart-Nachricht lässt jeden Client den Teil auswählen, den er rendern kann, und die Klartext-Alternative verbessert die Bewertung durch Spamfilter. Das Weglassen von text ist ein häufiger Grund dafür, dass E-Mails im Spam landen.

Sollte ich SMTP oder eine HTTP-API verwenden?

SMTP eignet sich für geringes Volumen und interne Tools. Für den Produktivversand im großen Maßstab macht eine HTTP-API den Server überflüssig, den Sie sonst betreiben müssten, und bringt Zustellbarkeit gleich mit. Viele Teams nutzen Nodemailer in der Entwicklung und eine API in der Produktion.

Nodemailer ist eine solide Wahl, um SMTP aus Node heraus zu sprechen. Wenn Sie den Mailserver dahinter lieber nicht selbst betreiben möchten, lesen Sie den Leitfaden zum E-Mail-Versand, um die API-Alternative von Anfang bis Ende zu sehen.

Bauen Sie auf demselben Netzwerk auf.

Ein Test-API-Schlüssel steht Ihnen sofort zur Verfügung. Der Produktivbetrieb wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Ihre nächste Idee.
Bereit zur Verbindung.