Email SDK
Adapters

SDK field support

See which EmailMessage fields Email SDK maps for each adapter.

Email SDK keeps one message shape, but email APIs do not all expose the same features. This page documents what each Email SDK adapter maps today. Stable adapters either map a field or reject it with a validation error. They should not silently drop message data.

How to read this page

  • Yes means the adapter maps that EmailMessage field.
  • No means the adapter rejects that field before calling the provider.
  • Values means Email SDK sends each tag's value to the provider.
  • First tag means only the first tag can be represented by that provider API.

Best fits

NeedStart with
Most complete API field mappingPostmark, SendGrid, Mailgun, Brevo
Resend-style DX with attachmentsResend
Cheap or self-managed deliverySMTP
Product/event emailLoops, Plunk
Provider fallback for productionResend plus SMTP, or one primary API plus Postmark
Attachment-heavy transactionalResend, Postmark, SendGrid, Mailgun, MailerSend

API adapters

These adapters cover most transactional email fields. They are the best fit when your app needs CC, BCC, reply-to, custom headers, tags, metadata, or attachments.

AdapterCCBCCReply-ToHeadersMetadataTagsAttachments
ResendYesYesYesYesNoYesYes
PostmarkYesYesYesYesYesFirst tagYes
SendGridYesYesYesYesYesValuesYes
MailgunYesYesYesYesYesValuesYes
MailerSendYesYesYesYesNoValuesYes
BrevoYesYesYesYesYesValuesYes
Mailchimp TransactionalYesYesNoYesYesValuesYes
MailtrapYesYesNoYesNoFirst tagYes

Narrow adapters

These adapters are useful, but their public APIs do not match the full EmailMessage shape. Email SDK keeps them stable by rejecting fields it cannot represent.

AdapterCCBCCReply-ToHeadersMetadataTagsAttachments
SparkPostNoNoYesYesYesValuesYes
LoopsNoNoNoNoYesNoNo
PlunkNoNoNoNoYesNoNo
ScalewayYesYesNoYesNoNoNo
ZeptoMailYesYesYesNoNoNoYes
MailPaceYesYesYesNoNoNoNo

SMTP transport

SMTP is built in and does not use Nodemailer. It maps address fields and headers directly to the SMTP message, but it does not map provider-only concepts like tags or metadata.

AdapterCCBCCReply-ToHeadersMetadataTagsAttachments
SMTPYesYesYesYesNoNoNo

Validation behavior

Unsupported fields fail fast. For example, Resend rejects metadata, Mailchimp Transactional rejects replyTo, and SMTP rejects attachments. That keeps production behavior boring: if a field matters, you find out before the provider request.

Attachment rules

Attachment content is treated as raw content by default and encoded to Base64 for API adapters that require Base64.

attachments: [
  {
    filename: "receipt.txt",
    content: "Thanks for your order.",
    contentType: "text/plain",
  },
];

If you already have Base64 content, mark it:

attachments: [
  {
    filename: "receipt.pdf",
    content: base64Pdf,
    contentEncoding: "base64",
    contentType: "application/pdf",
  },
];

Adapters that support attachments can also read a local path:

attachments: [
  {
    filename: "receipt.pdf",
    path: "./receipt.pdf",
    contentType: "application/pdf",
  },
];

On this page