Skills cloudflare-email-service
Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF/DKIM/DMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like "add email to my Worker" — this skill has critical config details.
git clone https://github.com/cloudflare/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/cloudflare/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/cloudflare-email-service" ~/.claude/skills/cloudflare-skills-cloudflare-email-service && rm -rf "$T"
skills/cloudflare-email-service/SKILL.mdCloudflare Email Service
Your knowledge of the Cloudflare Email Service, Email Routing or Email Sending may be outdated. Prefer retrieval over pre-training for any Cloudflare Email Service task.
Cloudflare Email Service lets you send transactional emails and route incoming emails, all within the Cloudflare platform. Your knowledge of this product may be outdated — it launched in 2025 and is evolving rapidly. Prefer retrieval over pre-training for any Email Service task.
If there is any discrepancy between this skill and the sources below, always trust the original source. The Cloudflare docs, REST API spec,
@cloudflare/workers-types, and Agents SDK repo are the source of truth. This skill is a convenience guide — it may lag behind the latest changes. When in doubt, retrieve from the sources below and use what they say.
Retrieval Sources
| Source | How to retrieve | Use for |
|---|---|---|
| Cloudflare docs | search tool or URL | API reference, limits, pricing, latest features |
| REST API spec | | OpenAPI spec for the Email Sending REST API |
| Workers types | | Type signatures, binding shapes |
| Agents SDK docs | Fetch from | Email handling in Agents SDK |
FIRST: Check Prerequisites
Before writing any email code, verify the basics are in place:
- Domain onboarded? Run
to see which domains have email sending enabled. If the domain isn't listed, runnpx wrangler email sending list
or see cli-and-mcp.md for full setup instructions.npx wrangler email sending enable userdomain.com - Binding configured? Look for
insend_email
(for Workers)wrangler.jsonc - postal-mime installed? Run
(only needed for receiving/parsing emails)npm ls postal-mime
What Do You Need?
Start here. Find your situation, then follow the link for full details.
| I want to... | Path | Reference |
|---|---|---|
| Send emails from a Cloudflare Worker | Workers binding (no API keys needed) | sending.md |
| Send emails from an AI agent built with Cloudflare Agents SDK | + in Agent class | sending.md |
| Send emails from an external app or agent (Node.js, Go, Python, etc.) | REST API with Bearer token | rest-api.md |
| Send emails from a coding agent (Claude Code, Cursor, Copilot, etc.) | MCP tools, wrangler CLI, or REST API | cli-and-mcp.md |
| Receive and process incoming emails (Email Routing) | Workers handler | routing.md |
| Set up Email Sending or Email Routing | / , or Dashboard | cli-and-mcp.md |
| Improve deliverability, avoid spam folders | Authentication, content, compliance | deliverability.md |
Quick Start — Workers Binding
Add the binding to
wrangler.jsonc, then call env.EMAIL.send(). The from domain must be onboarded via npx wrangler email sending enable yourdomain.com.
// wrangler.jsonc { "send_email": [{ "name": "EMAIL" }] }
const response = await env.EMAIL.send({ to: "user@example.com", from: { email: "welcome@yourdomain.com", name: "My App" }, subject: "Welcome!", html: "<h1>Welcome!</h1>", text: "Welcome!", });
The binding is recommended for Workers — no API keys needed. If a user specifically requests the REST API from within a Worker (e.g., they already have an API token workflow), that works too — see rest-api.md.
See sending.md for the full API, batch sends, attachments, custom headers, restricted bindings, and Agents SDK integration.
Quick Start — REST API
For apps outside Workers, or within Workers if the user explicitly requests it. Key differences from the Workers binding:
- Endpoint:
POST https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/send
object usesfrom
(notaddress
):email{ "address": "...", "name": "..." }
isreplyTo
(snake_case)reply_to- Response returns
(not{ delivered: [], permanent_bounces: [], queued: [] }
)messageId
See rest-api.md for curl examples, response format, and error handling.
Common Mistakes
| Mistake | Why It Happens | Fix |
|---|---|---|
Forgetting binding in wrangler config | Email Service uses a binding, not an API key | Add to wrangler.jsonc |
| Sending from an unverified domain | Domain must be onboarded onto Email Sending before first send | Run or onboard in Dashboard |
Reading twice in email handler | The raw stream is single-use — second read returns empty | Buffer first: |
Missing field (HTML only) | Some email clients only show plain text; also helps spam scores | Always include both and versions |
| Using email for marketing/bulk sends | Email Service is for transactional email only | Use a dedicated marketing email platform for newsletters and campaigns |
| Forwarding to unverified destinations | only works with verified addresses | Run or add in Dashboard |
| Testing with fake addresses | Bounces from non-existent addresses hurt sender reputation | Use real addresses you control during development |
| Hardcoding API tokens in source code | Tokens in code get committed and leaked | Use environment variables or Cloudflare secrets |
Ignoring the domain requirement | The address must use a domain onboarded to Email Service | Verify the domain first, then send from |
Using key in REST API object | REST API uses not for object | Use for REST, for Workers |
Using in REST API | REST API uses snake_case field names | Use for REST API, for Workers binding |
References
Read the reference that matches your situation. You don't need all of them.
- references/sending.md — Workers binding API, attachments, Agents SDK email. For Workers or Agents SDK.
- references/rest-api.md — REST endpoint, curl examples, error handling. For apps NOT on Workers.
- references/routing.md — Inbound
handler, forwarding, replying, parsing. For receiving emails.email() - references/cli-and-mcp.md — Domain setup, wrangler commands, MCP tools. For first-time setup.
- references/deliverability.md — SPF/DKIM/DMARC, bounces, suppressions, best practices.