AWS SES
Send through the SES v2 SendEmail API with built-in SigV4 signing and no AWS SDK dependency.
Capabilities
| Repeated headers | Idempotency | Scheduling | Personalized |
|---|---|---|---|
| Yes | none | No | expanded |
These values come from the adapter's exported capabilities declaration. The field support matrix covers normalized message fields.
The SES adapter calls the SES v2 SendEmail API with plain fetch and implements AWS Signature V4 signing itself, so your bundle does not pull in the AWS SDK. Pick a region, optionally a configuration set, and send.
Configure
Use credentials allowed to call SES v2 SendEmail in your region, and verify the sender identity in that same region. New AWS accounts start in the SES sandbox, which limits recipients to verified addresses.
import { createEmailClient } from "@opencoredev/email-sdk";
import { ses } from "@opencoredev/email-sdk/ses";
export const email = createEmailClient({
adapters: [
ses({
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
region: process.env.AWS_REGION!,
}),
],
});Prop
Type
Send
SES maps cc, bcc, replyTo, headers, attachments, and tags (as SES EmailTags, which flow to configuration-set event destinations).
const result = await email.send({
from: "Acme <billing@acme.com>",
to: "user@example.com",
replyTo: "support@example.com",
subject: "Your May invoice",
html: "<p>Your invoice for May is ready.</p>",
tags: [{ name: "type", value: "invoice" }],
});
console.log(result.id); // SES MessageIdNo metadata field
SES v2 SendEmail has no metadata concept, so metadata on a message throws an
EmailValidationError before any request is made. Use tags instead, or pick a metadata-capable
adapter.
Verify from the CLI
AWS_ACCESS_KEY_ID="..." AWS_SECRET_ACCESS_KEY="..." AWS_REGION="us-east-1" \
npx --package @opencoredev/email-sdk email-sdk doctor --adapter sesnpx --package @opencoredev/email-sdk email-sdk send \
--adapter ses \
--access-key-id "$AWS_ACCESS_KEY_ID" \
--secret-access-key "$AWS_SECRET_ACCESS_KEY" \
--region us-east-1 \
--from "Acme <hello@acme.com>" \
--to user@example.com \
--subject "SES smoke test" \
--text "It works" \
--dry-run--session-token and --configuration-set flags are also available. Drop --dry-run for one real send. It is the only way to prove the identity is verified and the account is out of the SES sandbox.
Compare AWS SES with other providers
Side-by-side message-field support from the SDK capability matrix, with working code for both adapters:
Frequently asked questions
Does Email SDK support AWS SES?
Yes. Email SDK ships a AWS SES adapter imported from @opencoredev/email-sdk/ses. You keep your AWS SES account and credentials; the SDK adds message validation, typed errors, and no-network test adapters around the same send() call used for every other provider.
Which message fields does the AWS SES adapter support?
AWS SES supports CC recipients, BCC recipients, Reply-To address, Custom headers, Attachments, and Tags. It does not support Metadata and Scheduled sending (sendAt); Email SDK rejects a message that uses those fields before any request is made.
Can AWS SES schedule email for later with Email SDK?
No. AWS SES has no provider-side scheduling, so a message with sendAt fails validation. Store the job in your own queue and send when it is due.
Does the AWS SES adapter support idempotent sends?
No. AWS SES has no provider-side idempotency, so a retried send can be delivered twice. Deduplicate in your own queue before retrying.