
Cloudflare Email Service
OfficialFreeEfficiently send and receive emails with Cloudflare.
Free · Opens the source repo
What Cloudflare Email Service does
The Cloudflare Email Service skill allows developers to seamlessly integrate email functionality into their applications using Cloudflare's infrastructure. This skill supports both sending transactional emails and routing incoming emails, making it ideal for applications that require reliable email communication. Whether you are building a Cloudflare Worker, using Node.js, Python, or Go, this skill provides the necessary tools to handle email operations effectively.
To get started, ensure your domain is onboarded for email sending and that the appropriate bindings are configured in your project. The skill includes detailed instructions on how to enable email sending and routing through the Cloudflare CLI, ensuring that you can quickly set up your environment. With this skill, you can send emails directly from your application without needing to manage API keys, simplifying the integration process.
For those using the Cloudflare Agents SDK, the skill offers specific methods for sending emails, allowing for easy integration with AI agents. Additionally, it provides guidance on improving email deliverability through best practices for SPF, DKIM, and DMARC configurations. This makes it suitable for developers looking to enhance their application's email capabilities while maintaining compliance with email standards.
The Cloudflare Email Service skill is particularly useful for developers and designers who need to implement email functionality in their applications without the overhead of managing a separate email service provider. It is designed for transactional email use cases, ensuring that your application can communicate effectively with users through email notifications, confirmations, and other essential communications.
When to use it
Use this skill when you need to integrate email functionality into your application, whether for sending transactional emails or handling incoming messages.
When not to use it
This skill is not suitable for bulk marketing emails or campaigns; it is specifically designed for transactional email use cases.
What you can build with it
Sending Emails from a Cloudflare Worker
Integrate email sending directly within your Cloudflare Worker by adding the appropriate binding to your configuration.
Receiving Incoming Emails
Utilize the email routing capabilities to handle and process incoming emails using the Workers email handler.
Integrating with External Applications
Use the REST API to send emails from applications built in Node.js, Python, or Go, providing flexibility in your development.
How to install Cloudflare Email Service
View source1. Install with the skills CLI
npx skills add cloudflare/skills/cloudflare-email-service --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by cloudflareCloudflare 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 | cloudflare-docs search tool or URL https://developers.cloudflare.com/email-service/ | API reference, limits, pricing, latest features |
| REST API spec | https://developers.cloudflare.com/api/resources/email_sending | OpenAPI spec for the Email Sending REST API |
| Workers types | https://www.npmjs.com/package/@cloudflare/workers-types | Type signatures, binding shapes |
| Agents SDK docs | Fetch docs/email.md from https://github.com/cloudflare/agents/tree/main/docs | Email handling in Agents SDK |
FIRST: Check Prerequisites
Before writing any email code, verify the basics are in place:
- Domain onboarded? Run
npx wrangler email sending listto see which domains have email sending enabled. If the domain isn't listed, runnpx wrangler email sending enable userdomain.comor see cli-and-mcp.md for full setup instructions. - Binding configured? Look for
send_emailinwrangler.jsonc(for Workers) - postal-mime installed? Run
npm ls postal-mime(only needed for receiving/parsing emails)
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 | onEmail() + replyToEmail() 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 email() handler | routing.md |
| Set up Email Sending or Email Routing | wrangler email sending enable / wrangler email routing enable, 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 fromobject usesaddress(notemail):{ "address": "...", "name": "..." }replyToisreply_to(snake_case)- Response returns
{ delivered: [], permanent_bounces: [], queued: [] }(notmessageId)
See rest-api.md for curl examples, response format, and error handling.
Common Mistakes
| Mistake | Why It Happens | Fix |
|---|---|---|
Forgetting send_email binding in wrangler config | Email Service uses a binding, not an API key | Add "send_email": [{ "name": "EMAIL" }] to wrangler.jsonc |
| Sending from an unverified domain | Domain must be onboarded onto Email Sending before first send | Run wrangler email sending enable yourdomain.com or onboard in Dashboard |
Reading message.raw twice in email handler | The raw stream is single-use — second read returns empty | Buffer first: const raw = await new Response(message.raw).arrayBuffer() |
Missing text field (HTML only) | Some email clients only show plain text; also helps spam scores | Always include both html and text 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 | message.forward() only works with verified addresses | Run wrangler email routing addresses create user@gmail.com 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 from domain requirement | The from address must use a domain onboarded to Email Service | Verify the domain first, then send from anything@that-domain.com |
Using email key in REST API from object | REST API uses address not email for from object | Use { "address": "...", "name": "..." } for REST, { "email": "...", "name": "..." } for Workers |
Using replyTo in REST API | REST API uses snake_case field names | Use reply_to for REST API, replyTo 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
email()handler, forwarding, replying, parsing. For receiving emails. - 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.
Frequently asked questions about Cloudflare Email Service
Similar skills
WinMD API Search
Easily find and explore Windows desktop APIs.
WebMCPify
Transform any web app into an agent-ready platform.
Phoenix Tracing
Instrument LLM applications with OpenInference tracing.
Foundry Hosted Agent CopilotKit
Guidance for developing agentic web apps on Azure.
Power Automate Foundation
Connect AI agents to Power Automate seamlessly.
Power Automate Flow Builder
Efficiently build and deploy Power Automate flows programmatically.
