@radonsdk/email16 providersOne send() across 16 providers.
Western, African, and raw cloud — Resend, SendGrid, Postmark, SES, Mailgun, Brevo, and Termii (first-class, not an afterthought). Batch sends, {{variable}} templates, and normalized delivery webhooks.
import { RadonEmail } from "@radonsdk/email";
const email = new RadonEmail({
providers: { resend: {} },
defaultFrom: "Acme <hello@acme.com>",
});
await email.send({
to: "ada@example.com",
subject: "Welcome, {{name}}!",
html: "<p>Hi {{name}}, thanks for joining.</p>",
variables: { name: "Ada" },
});16 providers
Resend, SendGrid, and SMTP free; Postmark, SES, Mailgun, Brevo, Mailjet, Termii, and more on Pro.
Template interpolation
Write {{name}} in the subject, html, or text and pass variables — free, no template service required.
Batch sends
Native bulk on Resend, Postmark, and Mailjet; a sequential fallback everywhere else, with result.batched telling you which ran.
Delivery webhooks
Bounces, complaints, and deliveries from every provider, normalized into one event stream — with signature verification where the provider supports it.
Scheduling
Set sendAt and Radon schedules the send on providers that support it (Resend, SendGrid, Mailgun, Brevo, and more).
Escape hatch
email.native() exposes the provider's own client for dashboards, templates, and provider-only features.
3 free, 13 on Pro — same call for every one.
A small, typed surface.
email.send({ to, subject, html, variables }): Promise<SendResult>Send one message with {{variable}} interpolation applied.
email.sendBatch(messages): Promise<BatchResult>PROSend many at once — native bulk where available.
email.templates.register(template): Promise<void>PRORegister, update, list, get, and delete reusable templates.
email.webhooks.handle(request): Promise<EmailEvent[]>PROVerify + normalize delivery webhooks into events.
await email.sendBatch([
{ to: "ada@example.com", subject: "Hi {{name}}", html: tpl, variables: { name: "Ada" } },
{ to: "grace@example.com", subject: "Hi {{name}}", html: tpl, variables: { name: "Grace" } },
]);Every message needs a from
Set defaultFrom in config or a from per message — otherwise send() throws. And Termii is template/OTP-only (no arbitrary body) and sends to exactly one recipient per request; the SDK surfaces those provider rules as typed errors, never silent failures.