Email SDK
Adapters

Adapters

Supported email service adapters and transports.

Email SDK ships with 20 adapters. Import only the adapter you use; the package does not ask you to configure providers that are not on your send path.

Every adapter follows the same contract: map the fields it supports and throw a validation error for fields the provider API cannot represent. Use the SDK field support guide before choosing fallback routes.

Sponsors

Companies helping keep Email SDK practical and maintained. Open slots are available.

Resend logo
Resend
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/resend
Postmark logo
Postmark
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/postmark
SendGrid logo
SendGrid
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/sendgrid
AWS SES logo
AWS SES
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/ses
Mailgun logo
Mailgun
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/mailgun
MailerSend logo
MailerSend
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/mailersend
Brevo logo
Brevo
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/brevo
Mailchimp Transactional logo
Mailchimp Transactional
Popular APIs
OfficialNot API testedRequest tested
@opencoredev/email-sdk/mailchimp
SparkPost logo
SparkPost
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/sparkpost
Mailtrap logo
Mailtrap
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/mailtrap
Cloudflare Email Sending logo
Cloudflare Email Sending
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/cloudflare
Scaleway logo
Scaleway
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/scaleway
ZeptoMail logo
ZeptoMail
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/zeptomail
MailPace logo
MailPace
Infrastructure
OfficialNot API testedRequest tested
@opencoredev/email-sdk/mailpace
Loops logo
Loops
Product-led
OfficialNot API testedRequest tested
@opencoredev/email-sdk/loops
Plunk logo
Plunk
Product-led
OfficialNot API testedRequest tested
@opencoredev/email-sdk/plunk
SMTP
SMTP
Transport
OfficialNo provider APIBuilt-in transport
@opencoredev/email-sdk/smtp

Which adapter should I start with?

If you want...Start with
The fastest first sendResend
Mature transactional delivery controlsPostmark, SendGrid, AWS SES, Mailgun, Unosend, or Brevo
A backup route for production deliveryA primary API adapter plus Postmark or SMTP
Product-triggered emailsIterable, Sequenzy, Loops, or Plunk
A cheap or self-managed transportSMTP
Heavy attachment supportResend, Postmark, SendGrid, Mailgun, Unosend, MailerSend, Mailtrap, Sequenzy

Want to build a community adapter?

Do not add third-party provider experiments to the official package by default. Publish a separate community package, export an adapter plugin, and list it in the community registry if you want discoverability.

What the status labels mean

Provider cards use these labels:

  • Official means the adapter ships in @opencoredev/email-sdk.
  • Sponsor means the provider supports Email SDK. Sponsor adapters appear first in the catalog.
  • API tested means a local check has successfully called a live provider API with a real key. It does not prove live delivery unless the adapter page says a send was performed.
  • Not API tested means we have not yet run a live provider API check for that adapter.
  • Request tested means repository tests cover request mapping, responses, and fail-fast validation with injected fetch calls.
  • Built-in transport means the adapter sends through Email SDK's own transport implementation instead of a provider API.
  • No provider API means the adapter does not call a hosted provider API.

Email SDK can catch unsupported fields before a request. It cannot make a provider account ready to send from an unverified domain.

Import pattern

Start with one adapter. Add a fallback only after the fallback supports the same message shape your app sends.

import { createEmailClient } from "@opencoredev/email-sdk";
import { resend } from "@opencoredev/email-sdk/resend";
import { smtp } from "@opencoredev/email-sdk/smtp";

const email = createEmailClient({
  adapters: [
    resend({ apiKey: process.env.RESEND_API_KEY! }),
    smtp({
      host: process.env.SMTP_HOST!,
      auth: {
        user: process.env.SMTP_USER!,
        pass: process.env.SMTP_PASS!,
      },
    }),
  ],
  fallback: ["smtp"],
});

Route a single send through another configured adapter when a message has a provider-specific job.

const response = await email.send(
  {
    from: "Acme <hello@acme.com>",
    to: "user@example.com",
    subject: "Password reset",
    text: "Use this link to reset your password.",
  },
  {
    adapter: "smtp",
  },
);

console.log(response.provider);

Before adding the provider to production, run a dry run and then a live smoke test from the same environment that will send mail.

npx email-sdk adapters
RESEND_API_KEY="re_..." npx email-sdk send \
  --dry-run \
  --adapter resend \
  --from "Acme <hello@acme.com>" \
  --to user@example.com \
  --subject "Dry run" \
  --text "Validate only"

Adapter groups

GroupAdapters
Popular APIsResend, Postmark, SendGrid, Mailgun, MailerSend, Brevo, Mailchimp Transactional
InfrastructureCloudflare Email Sending, SparkPost, Mailtrap, Scaleway, ZeptoMail, MailPace
Product-ledIterable, Sequenzy, Loops, Plunk
TransportBuilt-in SMTP

On this page