Email

E-mails versturen met Nodemailer

Nodemailer is de standaardbibliotheek voor het versturen van e-mail vanuit een Node.js-server. Je maakt een transport aan dat naar een SMTP-server wijst en roept vervolgens sendMail aan met de berichtvelden. Het regelt connection pooling, bijlagen en HTML-bodies. De code hieronder is het minimum dat je nodig hebt om een echt bericht te versturen, plus de testtrick die de meeste mensen missen.

Hoe installeer en configureer je Nodemailer?

Installeer het via npm:

npm install nodemailer

Een transport bevat je SMTP-verbindingsgegevens. Je wijst het naar een host en poort en geeft credentials mee onder 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,
  },
});

Poort 587 met secure: false gebruikt STARTTLS, dat de verbinding na de handshake upgradet naar TLS. Poort 465 verwacht secure: true. Bewaar de gebruikersnaam en het wachtwoord in omgevingsvariabelen, nooit in de broncode.

Hoe verstuur je een bericht?

Roep sendMail aan met de envelope en de inhoud. Het geeft een promise terug, dus verpak het in async/await met een try/catch zodat een mislukte verzending het proces niet laat crashen:

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();

Verstuur altijd zowel text als html. Sommige clients tonen het platte-tekstdeel, en een bericht zonder tekstalternatief scoort doorgaans slechter bij spamfilters.

Hoe voeg je bijlagen toe?

Geef een attachments-array mee. Elk element kan lezen vanuit een pad, een buffer of een stream:

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.",
    },
  ],
});

Hoe test je zonder echte mail te versturen?

Nodemailer wordt geleverd met Ethereal, een nep-SMTP-service die berichten opvangt in plaats van ze af te leveren. Je krijgt een preview-URL voor elke verzending, ideaal voor lokale ontwikkeling:

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 is bedoeld om te inspecteren wat je hebt gebouwd. Het vertelt je niets over of een echte inbox het bericht zou accepteren.

Verstuur het met Bird

SMTP werkt, maar het in productie draaien betekent een mailserver beheren (of er een huren), IP's opwarmen en zelf reputatie bewaken. Een HTTP API neemt dat uit handen. Er is geen SMTP-socket om open te houden en de provider beheert de afleverinfrastructuur. Met de Bird e-mail-API is dezelfde verzending één enkele aanroep:

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();

Het delivered@bird.dev-sandboxadres accepteert altijd mail, zodat je de koppeling kunt bevestigen voordat je naar een echte ontvanger wijst. Serverless-platforms zijn het duidelijkste geval voor deze aanpak, omdat hun function-runtimes vaak helemaal geen SMTP-verbindingen open kunnen houden. Zie e-mail versturen op Vercel voor dat pad en het bredere overzicht e-mail versturen met JavaScript voor waar e-mailcode thuishoort in je stack.

FAQ

Werkt Nodemailer in de browser?

Nee. Nodemailer is een server-side bibliotheek en is afhankelijk van de netwerkmodules van Node. Browsers kunnen geen SMTP-verbindingen openen, en credentials in clientcode plaatsen zou ze blootstellen. Verstuur vanuit een backend.

Waarom zowel tekst als HTML versturen?

Een multipart-bericht laat elke client het deel kiezen dat hij kan weergeven, en het platte-tekstalternatief verbetert hoe spamfilters het bericht lezen. Het weglaten van text is een veelvoorkomende reden dat e-mails in spam belanden.

Moet ik SMTP gebruiken of een HTTP API?

SMTP is prima voor laag volume en interne tools. Voor productieverzending op schaal verwijdert een HTTP API de server die je anders zou moeten beheren en biedt ingebouwde afhandeling van afleverbaarheid. Veel teams gebruiken Nodemailer in ontwikkeling en een API in productie.

Nodemailer is een solide keuze om SMTP te praten vanuit Node. Als je liever niet de mailserver erachter draait, lees dan de handleiding voor e-mail versturen om het API-alternatief van begin tot eind te bekijken.

Bouw op hetzelfde netwerk.

Een test-API-key is direct beschikbaar. Productietoegang wordt ontgrendeld zodra u een betaalmethode toevoegt en een afzender verifieert.

Jouw volgende idee.
Klaar om te verbinden.