Cloudflare Email Sending
Send through Cloudflare's Email Sending REST API with plain-address recipients and a 50-recipient cap.
The Cloudflare adapter calls Cloudflare's Email Sending REST API over fetch — no extra dependency and no Worker binding required. It is the natural pick when your sending domain already lives in Cloudflare; the trade-off is strict recipient rules: plain addresses only, 50 recipients max.
@opencoredev/email-sdk/cloudflareConfigure
Enable Email Sending for your account and domain, then create an API token with Email Sending permission. You also need your account ID.
import { createEmailClient } from "@opencoredev/email-sdk";
import { cloudflare } from "@opencoredev/email-sdk/cloudflare";
export const email = createEmailClient({
adapters: [
cloudflare({
apiToken: process.env.CLOUDFLARE_API_TOKEN!,
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
}),
],
});Prop
Type
Send
Cloudflare maps cc, bcc, one replyTo, headers, and attachments — no tags or metadata.
const result = await email.send({
from: "Acme Alerts <alerts@acme.com>",
to: "oncall@example.com",
cc: "ops@example.com",
subject: "Disk usage above 90% on db-1",
text: "db-1 crossed the 90% disk threshold at 14:02 UTC.",
headers: { "X-Alert-ID": "alrt_8841" },
});
console.log(result.accepted); // delivered + queued recipientsCloudflare does not return a message id; instead result.accepted lists delivered and queued recipients and result.rejected lists permanent bounces. Total recipients across to, cc, and bcc are capped at 50.
Plain recipient addresses only
to, cc, and bcc must be bare addresses like "user@example.com" — a display name throws an
EmailValidationError before any request is made. Only from and replyTo keep display names.
Verify from the CLI
CLOUDFLARE_API_TOKEN="..." CLOUDFLARE_ACCOUNT_ID="..." npx email-sdk doctor --adapter cloudflarenpx email-sdk send \
--adapter cloudflare \
--api-token "$CLOUDFLARE_API_TOKEN" \
--account-id "$CLOUDFLARE_ACCOUNT_ID" \
--from "Acme <hello@acme.com>" \
--to user@example.com \
--subject "Cloudflare smoke test" \
--text "It works" \
--dry-runDrop --dry-run for one real send — only Cloudflare can prove the domain and account are cleared to deliver.
