Email SDK
Concepts

Adapter model

How Email SDK adapters, routing names, and escape hatches work.

An adapter is an Email SDK module that knows how to send through one service or transport.

import { createEmailClient } from "email-sdk";
import { resend } from "email-sdk/resend";
import { postmark } from "email-sdk/postmark";

const email = createEmailClient({
  adapters: [
    resend({ apiKey: process.env.RESEND_API_KEY! }),
    postmark({ serverToken: process.env.POSTMARK_SERVER_TOKEN! }),
  ],
});

Routing names

Each adapter registers a routing name. Email SDK uses that name for defaults, fallbacks, and per-send overrides.

AdapterRouting name
Resendresend
SMTPsmtp
Postmarkpostmark
SendGridsendgrid
Mailgunmailgun
MailerSendmailersend
Brevobrevo
Mailchimp Transactionalmailchimp
SparkPostsparkpost
Loopsloops
Plunkplunk
Mailtrapmailtrap
Scalewayscaleway
ZeptoMailzeptomail
MailPacemailpace

Send with one adapter

await email.send(message, {
  adapter: "postmark",
});

Bind one adapter

const transactional = email.withAdapter("postmark");

await transactional.send(message);

Use adapter escape hatches

Every adapter can expose raw. Keep provider-specific code close to the adapter and keep normal application code on the shared send path.

const adapter = email.adapter("resend");

console.log(adapter.raw);

The older provider, defaultProvider, email.provider(), and email.withProvider() names still work as aliases.

On this page