Node.js / TypeScript
Gebruik de officiële @nljerry/wesender-node SDK voor de best mogelijke TypeScript-ervaring
met volledige type-definities. Werkt met Node.js 18+, Bun en Deno.
github.com/nljerry/wesender-node
Installatie
npm install @nljerry/wesender-node bun add @nljerry/wesender-node pnpm add @nljerry/wesender-node Initialisatie
import { Wesender } from "@nljerry/wesender-node"
export const ws = new Wesender(process.env.WS_API_KEY!) E-mail versturen
const { id, status } = await ws.emails.send({
from: "noreply@joudomein.nl",
to: "klant@voorbeeld.nl",
subject: "Welkom!",
html: "<p>Bedankt voor je registratie.</p>",
})
console.log(id, status) // em_01hw... queued Meerdere ontvangers & CC
await ws.emails.send({
from: "noreply@joudomein.nl",
to: ["a@voorbeeld.nl", "b@voorbeeld.nl"],
cc: ["manager@bedrijf.nl"],
bcc: ["audit@bedrijf.nl"],
subject: "Maandelijks rapport",
html: "<p>Zie bijlage.</p>",
}) Bijlagen
import { readFileSync } from "fs"
const pdf = readFileSync("./factuur.pdf").toString("base64")
await ws.emails.send({
from: "facturen@joudomein.nl",
to: "klant@voorbeeld.nl",
subject: "Factuur 2026-0142",
html: "<p>Bijgevoegd vind je jouw factuur.</p>",
attachments: [{
filename: "factuur-2026-0142.pdf",
content: pdf,
content_type: "application/pdf",
}],
}) Batch versturen
const results = await ws.emails.sendBatch([
{ from: "nl@bedrijf.nl", to: "a@voorbeeld.nl", subject: "Hoi A", html: "<p>A</p>" },
{ from: "nl@bedrijf.nl", to: "b@voorbeeld.nl", subject: "Hoi B", html: "<p>B</p>" },
])
results.forEach(r => console.log(r.id, r.status)) Domeinen beheren
// Alle domeinen
const domeinen = await ws.domains.list()
// Domein toevoegen
const domein = await ws.domains.create("joudomein.nl")
console.log(domein.dnsRecords) // SPF, DKIM en DMARC-records
// DNS verifiëren
const geverifieerd = await ws.domains.verify(domein.id)
console.log(geverifieerd.spfOk, geverifieerd.dkimOk) API-sleutels beheren
// Alle sleutels ophalen
const sleutels = await ws.apiKeys.list()
// Nieuwe sleutel aanmaken
const { id, token } = await ws.apiKeys.create("Productie-server")
console.log(token) // ws_live_... (sla dit op!)
// Sleutel verwijderen
await ws.apiKeys.delete(id) Webhooks
const webhook = await ws.webhooks.create(
"https://joudomein.nl/webhooks/email",
["email.delivered", "email.bounced", "email.opened"],
)
console.log(webhook.secret) // gebruik dit om handtekening te valideren Foutafhandeling
import { Wesender, WesenderError } from "@nljerry/wesender-node"
try {
await ws.emails.send({ from: "...", to: "...", subject: "...", html: "..." })
} catch (err) {
if (err instanceof WesenderError) {
console.error(err.message, err.status, err.code)
// bijv. "Domain not verified", 422, "domain_not_verified"
}
throw err
} Next.js Server Action
"use server"
import { ws } from "@/lib/wesender"
export async function sendWelcomeEmail(to: string, name: string) {
return ws.emails.send({
from: "noreply@joudomein.nl",
to,
subject: `Welkom, ${name}!`,
html: `<h1>Hoi ${name}!</h1><p>Bedankt voor je aanmelding.</p>`,
})
} Zonder SDK (fetch)
Wil je liever geen dependency toevoegen? De REST API werkt ook direct met fetch.
const res = await fetch("https://api.wesender.nl/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "noreply@joudomein.nl", to: "klant@voorbeeld.nl",
subject: "Hallo!", html: "<p>Via fetch.</p>",
}),
})
const { id } = await res.json()