# Adapters (/docs/v/0.4.0/adapters)



Email SDK ships with 17 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 <a href="/docs/v/0.4.0/adapters/field-support">SDK field support guide</a>
before choosing fallback routes.

<ProviderGrid />

## Which adapter should I start with? [#which-adapter-should-i-start-with]

| If you want...                         | Start with                                                |
| -------------------------------------- | --------------------------------------------------------- |
| The fastest first send                 | Resend                                                    |
| Mature transactional delivery controls | Postmark, SendGrid, AWS SES, Mailgun, 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, MailerSend, Mailtrap |

## What the status labels mean [#what-the-status-labels-mean]

Provider cards use three labels:

* `Official` means the adapter ships in `@opencoredev/email-sdk`.
* `Payload-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.
* `Live account required` means final delivery still depends on provider setup: verified domains, sender identities, API scopes, sandbox settings, regions, rate limits, and provider policy.
* `SMTP server required` means 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-pattern]

```ts
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 [#adapter-groups]

| Group          | Adapters                                                                        |
| -------------- | ------------------------------------------------------------------------------- |
| Popular APIs   | Resend, Postmark, SendGrid, Mailgun, MailerSend, Brevo, Mailchimp Transactional |
| Infrastructure | Cloudflare Email Sending, SparkPost, Mailtrap, Scaleway, ZeptoMail, MailPace    |
| Product-led    | Loops, Plunk                                                                    |
| Transport      | Built-in SMTP                                                                   |
