AWS SES
Send through the SES v2 SendEmail API with built-in SigV4 signing — no AWS SDK dependency.
The SES adapter calls the SES v2 SendEmail API over fetch and signs every request with AWS Signature V4 itself — your bundle never pulls in the AWS SDK. Pick a region, optionally a configuration set, and send.
@opencoredev/email-sdk/sesConfigure
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 MessageId, also exposed as result.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 email-sdk doctor --adapter sesnpx 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 — that is the only check that proves the identity is verified and the account is out of the sandbox.
