Email SDK
Adapters

Plunk

Send through the Plunk API with reply-to, headers, attachments, and metadata mapped to Plunk data.

Capabilities

Repeated headersIdempotencySchedulingPersonalized
NononeNoexpanded

These values come from the adapter's exported capabilities declaration. The field support matrix covers normalized message fields.

The Plunk adapter calls the Plunk send API with plain fetch. Plunk takes a single body field, so the adapter sends html when present and falls back to text.

Plunk logo
Plunk@opencoredev/email-sdk/plunk
Provider docs

Configure

Create a secret API key in your Plunk project and verify the sender you plan to use in from.

lib/email.ts
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: [{ name: "X-Export-ID", value: "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/emailId

No 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 plunk
PLUNK_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-run

Drop --dry-run for one real smoke send to confirm the API key and verified sender work end to end.

On this page