cloudflare-email-service

Send and receive transactional emails using Cloudflare Email Service bindings, REST API, and Email Routing.

13|1|Updated Feb 9, 2026
One-click install
npx skills add https://github.com/vedang/dotagents --skill cloudflare-email-service-vedang
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: cloudflare-email-service
Source: https://github.com/vedang/dotagents/tree/main/specific_skills/cloudflare-email-service
Command: npx skills add https://github.com/vedang/dotagents --skill cloudflare-email-service-vedang

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill requires postal-mime, mimetext, and includes references (resource) components.

What problem does it solve? Integrating transactional email into applications requires navigating Cloudflare Email Service setup, domain onboarding, binding configuration, and deliverability rules, which are easy to get wrong without up-to-date guidance. ## Core Features & Use Cases - Send Emails from Workers: Configure the send_email binding in wrangler.jsonc and call env.EMAIL.send() with attachments, custom headers, and multiple recipients. - REST API Integration: Send emails from Node.js, Python, Go, or any external app via the Email Sending REST endpoint with Bearer token authentication. - Inbound Email Routing: Receive, parse, forward, and reply to incoming emails using the Workers email() handler, postal-mime parsing, and Durable Object storage patterns. - Use Case: A developer building a support inbox on Cloudflare Workers uses this Skill to onboard a domain, route incoming emails to a Durable Object, and send threaded replies via the send_email binding. ## Quick Start Ask the agent to add email sending to your Cloudflare Worker using the send_email binding and onboard your domain with wrangler.

Frequently Asked Questions about cloudflare-email-service

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I send emails from a Cloudflare Worker?

Add a send_email binding to wrangler.jsonc with { "send_email": [{ "name": "EMAIL" }] }, then call env.EMAIL.send() with to, from, subject, html, and text fields. The from domain must be onboarded first via wrangler email sending enable.

How do I receive and parse incoming emails with Cloudflare Email Routing?

Export an email() handler from your Worker and create a routing rule pointing addresses to it. Buffer message.raw once with new Response(message.raw).arrayBuffer(), then parse it with postal-mime to extract subject, text, and attachments.

What is the difference between the Workers binding and the REST API for email sending?

The Workers binding uses email in the from object, replyTo in camelCase, and returns a messageId. The REST API uses address, reply_to in snake_case, returns delivered/permanent_bounces/queued arrays, and requires a Bearer API token.

Can I use Cloudflare Email Service for marketing or bulk email campaigns?

No. Cloudflare Email Service is restricted to transactional email triggered by user actions, such as signups, password resets, and order confirmations. Marketing newsletters and bulk campaigns require a dedicated marketing email platform.

Why does my email send fail with E_SENDER_NOT_VERIFIED?

This error means the from domain has not been onboarded to Email Sending. Run npx wrangler email sending enable yourdomain.com or onboard the domain in the Cloudflare Dashboard, which auto-configures SPF and DKIM records.

Why is message.raw empty when I read it twice in the email handler?

The message.raw stream is single-use, so a second read returns empty. Buffer it first with const raw = await new Response(message.raw).arrayBuffer(), then reuse the buffer for parsing or forwarding.