Adapters
Supported email service adapters and transports.
Email SDK ships with 18 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.
@opencoredev/email-sdk/resend@opencoredev/email-sdk/postmark@opencoredev/email-sdk/sendgrid@opencoredev/email-sdk/ses@opencoredev/email-sdk/mailgun@opencoredev/email-sdk/mailersend@opencoredev/email-sdk/brevo@opencoredev/email-sdk/mailchimp@opencoredev/email-sdk/sparkpost@opencoredev/email-sdk/mailtrap@opencoredev/email-sdk/cloudflare@opencoredev/email-sdk/scaleway@opencoredev/email-sdk/zeptomail@opencoredev/email-sdk/mailpace@opencoredev/email-sdk/loops@opencoredev/email-sdk/plunk@opencoredev/email-sdk/smtpWhich adapter should I start with?
| If you want... | Start with |
|---|---|
| The fastest first send | Resend |
| Mature transactional delivery controls | Postmark, SendGrid, AWS SES, Mailgun, Unosend, or Brevo |
| A backup route for production delivery | A primary API adapter plus Postmark or SMTP |
| Product-triggered emails | Loops or Plunk |
| A cheap or self-managed transport | SMTP |
| Heavy attachment support | Resend, Postmark, SendGrid, Mailgun, Unosend, MailerSend |
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.
Create an adapter
Implement the provider mapping and wrap it as an adapter plugin.
Publish a community adapter
Build and publish a third-party provider package without making it official.
What the status labels mean
Provider cards use three labels:
Officialmeans the adapter ships in@opencoredev/email-sdk.Payload-testedmeans repository tests cover request mapping, responses, and fail-fast validation with injected fetch calls.Built-in transportmeans the adapter sends through Email SDK's own transport implementation instead of a provider API.Live account requiredmeans final delivery still depends on provider setup: verified domains, sender identities, API scopes, sandbox settings, regions, rate limits, and provider policy.SMTP server requiredmeans final delivery depends on the SMTP host, credentials, and TLS settings you provide.
Email SDK can catch unsupported fields before a request. It cannot make a provider account ready to send from an unverified domain.
Import pattern
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"],
});Adapter groups
| Group | Adapters |
|---|---|
| Popular APIs | Resend, Postmark, SendGrid, Mailgun, Unosend, MailerSend, Brevo, Mailchimp Transactional |
| Infrastructure | Cloudflare Email Sending, SparkPost, Mailtrap, Scaleway, ZeptoMail, MailPace |
| Product-led | Loops, Plunk |
| Transport | Built-in SMTP |
