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

Capabilities

The EmailCapabilities schema, idempotency modes, and what each of the 16 providers supports.

EmailCapabilities describes what a provider layer can send. Read it from email.capabilities. How the checks run is described in Capabilities.

EmailCapabilities

FieldTypeDescription
textbooleanAccepts a text body.
htmlbooleanAccepts an html body.
htmlAndTextbooleanAccepts both bodies in one message.
senderNamebooleanAccepts a display name on from.
ccbooleanAccepts cc.
bccbooleanAccepts bcc.
replyTo"none" | "single" | "multiple"Number of reply-to addresses allowed.
headersbooleanAccepts custom headers.
attachmentsbooleanAccepts attachments.
inlineAttachmentsbooleanAccepts attachments with a contentId.
idempotencyIdempotencyWhether and how a key is honored.

The schema requires text or html to be true, requires both when htmlAndText is true, and requires attachments when inlineAttachments is true. Email.make fails with a TypeError otherwise.

Idempotency

ShapeMeaning
{ mode: "unsupported" }A key fails with UnsupportedFeatureError.
{ mode: "replay", retention? }A repeated key returns the earlier outcome.
{ mode: "reject", retention? }A repeated key fails with IdempotencyConflictError.

retention is a Duration. It is declared, not enforced.

RetryAfter

A schema for a finite, non-negative Duration. It is the type of retryAfter on RateLimitedError, QuotaExceededError and ProviderUnavailableError, and of retention.

Provider matrix

A dash means the field is not supported. replyTo shows none, single (one address) or multiple.

ProvidertexthtmlhtmlAndTextsenderNameccbccreplyToheadersattachmentsinlineAttachmentsidempotency
resendyesyesyesyesyesyesmultipleyesyesyesreplay, 24 hours
nodemaileryesyesyesyesyesyesmultipleyesyesyes-
sesyesyesyesyesyesyesmultipleyesyesyes-
azureyesyesyes-yesyesmultipleyesyesyes-
postmarkyesyesyesyesyesyesmultipleyesyesyes-
sendgridyesyesyesyesyesyessingleyesyesyes-
mailgunyesyesyesyesyesyesmultipleyesyes--
mailersendyesyesyesyesyesyessingleyes---
brevoyesyesyesyesyesyessingleyes--reject, 30 minutes
mailtrapyesyesyesyesyesyessingleyesyesyes-
scalewayyesyesyesyesyesyesmultipleyesyes--
lettermintyesyesyesyesyesyesmultipleyesyesyesreplay, 24 hours
eusendyesyesyesyesyesyesmultipleyesyesyesreplay
zeptomailyesyesyesyesyesyesmultipleyesyesyes-
mailchimp-transactionalyesyesyesyesyesyesmultipleyesyes--
plunk-yes-yes--none----

lettermint also reports its provider name as lettermint/sandbox when sandbox: true. Some providers reject a field for reasons that are not capability flags, such as the @ Lettermint needs in an inline contentId. Those fail with InvalidMessageError.

The plunk row means a message with a text body fails the capability check, so Plunk takes html only, with no cc, bcc, reply-to, headers or attachments.