Documentation for agents: an index at /llms.txt, every docs page in one file at /llms-full.txt, and Markdown for any docs page by adding .md to its URL.

Effect KitEmails

Choosing a provider

Compare what each provider supports before you pick one.

All 16 providers share the Email service, but they do not support the same message features. The package checks the message against the provider's capabilities first, and fails with UnsupportedFeatureError before any request when a feature is missing.

Example (Changing the Provider Without Changing the Program)

import { Effect } from "effect";
import { Email } from "@effect-kit/emails";
import * as Resend from "@effect-kit/emails/resend";

const program = Effect.gen(function* () {
  const email = yield* Email;
  return yield* email.send({
    from: "hello@example.com",
    to: "ada@example.com",
    subject: "Welcome",
    text: "Your account is ready.",
  });
});

Effect.runPromise(program.pipe(Effect.provide(Resend.layerConfig())));

What differs

Every provider supports text, HTML, both together, cc, bcc and custom headers, except Plunk. The rest of the differences:

ProviderReply-toAttachmentsInline imagesSender nameIdempotency
resendmultipleyesyesyesreplay, 24 hours
nodemailermultipleyesyesyesno
sesmultipleyesyesyesno
azuremultipleyesyesnono
postmarkmultipleyesyesyesno
sendgridoneyesyesyesno
mailgunmultipleyesnoyesno
mailersendonenonoyesno
brevoonenonoyesreject, 30 minutes
mailtraponeyesyesyesno
scalewaymultipleyesnoyesno
lettermintmultipleyesyesyesreplay, 24 hours
eusendmultipleyesyesyesreplay
zeptomailmultipleyesyesyesno
mailchimp-transactionalmultipleyesnoyesno
plunknonenonoyesno

Only Resend, Lettermint, eusend and Brevo support idempotency keys. On any other provider, a message sent with an idempotencyKey fails with UnsupportedFeatureError before sending. Lettermint inline images need a content id that contains @.

Plunk is HTML only

Plunk sends HTML with exactly one to address and no name. It has no text body, cc, bcc, reply-to, headers or attachments, so any of those fail with UnsupportedFeatureError.

Read these at runtime from email.capabilities, and see the provider overview for the full matrix.

On this page