Plunk
Send through the Plunk API with reply-to, headers, attachments, and metadata mapped to Plunk data.
The Plunk adapter calls the Plunk send API over fetch — no extra dependency. Plunk takes a single body field, so the adapter sends html when present and falls back to text.
@opencoredev/email-sdk/plunkConfigure
Create a secret API key in your Plunk project and verify the sender you plan to use in from.
import { createEmailClient } from "@opencoredev/email-sdk";
import { plunk } from "@opencoredev/email-sdk/plunk";
export const email = createEmailClient({
adapters: [plunk({ apiKey: process.env.PLUNK_API_KEY! })],
});Prop
Type
Send
Plunk supports headers, attachments, metadata (sent as Plunk data), and a single replyTo (sent as reply, email address only — a second reply-to throws an EmailValidationError).
const result = await email.send({
from: "Acme <hello@acme.com>",
to: "user@example.com",
replyTo: "support@acme.com",
subject: "Your export is ready",
html: "<p>Download your workspace export below.</p>",
headers: { "X-Export-ID": "exp_123" },
metadata: { exportId: "exp_123" },
attachments: [
{ filename: "export.csv", content: "name,total\nAda,42", contentType: "text/csv" },
],
});
console.log(result.id); // Plunk email id from data.emails[0], falling back to id/emailIdNo cc, bcc, or tags
Plunk has no cc, bcc, or tags, so any of them on a message throws an
EmailValidationError before a request is made. Check
field support before using Plunk in a fallback route.
Verify from the CLI
PLUNK_API_KEY="sk_..." npx email-sdk doctor --adapter plunkPLUNK_API_KEY="sk_..." npx email-sdk send \
--adapter plunk \
--from "Acme <hello@acme.com>" \
--to user@example.com \
--subject "Plunk smoke test" \
--text "It works" \
--dry-runDrop --dry-run for one real smoke send to confirm the API key and verified sender work end to end.
