aceternity-ui
100+ animated React components (Aceternity UI) for Next.js with Tailwind. Use for hero sections, parallax, 3D effects, or…
Cloudflare Email Routing for receiving/sending emails via Workers. Use for email workers, forwarding, allowlists, or encountering Email Trigger errors, worker call failures, SPF issues.
Claude Code
$ npx -y skills add secondsky/claude-skills --skill cloudflare-email-routing --agent claude-code
Codex
$ npx skills add secondsky/claude-skills --skill cloudflare-email-routing -a codex -y
Cursor
$ npx skills add secondsky/claude-skills --skill cloudflare-email-routing -a cursor -y
Gemini CLI
$ npx skills add secondsky/claude-skills --skill cloudflare-email-routing -a gemini-cli -y
GitHub Copilot
$ npx skills add secondsky/claude-skills --skill cloudflare-email-routing -a github-copilot -y
OpenCode
$ npx skills add secondsky/claude-skills --skill cloudflare-email-routing -a opencode -y
Windsurf
$ npx skills add secondsky/claude-skills --skill cloudflare-email-routing -a windsurf -y
name: cloudflare-email-routing
description: "Cloudflare Email Routing for receiving/sending emails via Workers. Use for email workers, forwarding, allowlists, or encountering Email Trigger errors, worker call failures, SPF issues."
license: MIT
metadata:
version: "2.0.0"
last_verified: "2025-11-18"
production_tested: true
token_savings: "~60%"
errors_prevented: 8
templates_included: 0
references_included: 1
keywords:
- Cloudflare Email Routing
- Email Workers
- send email
- receive email
- email forwarding
- email allowlist
- email blocklist
- postal-mime
- mimetext
- "cloudflare:email"
- EmailMessage
- ForwardableEmailMessage
- EmailEvent
- MX records
- SPF
- DKIM
- email worker binding
- send_email binding
- wrangler email
- email handler
- email routing worker
- "\"Email Trigger not available\""
- "\"failed to call worker\""
- email delivery failed
- email not forwarding
- destination address not verified**Status**: Production Ready ✅ | **Last Verified**: 2025-11-18
---
Two capabilities:
1. **Email Workers** - Receive and process incoming emails (allowlists, forwarding, parsing) 2. **Send Email** - Send emails from Workers to verified addresses
Both **free** and work together for complete email functionality.
---
**Dashboard setup:** 1. Dashboard → Domain → **Email** → **Email Routing** 2. **Enable Email Routing** → **Add records and enable** 3. Create destination address:
4. ✅ Basic forwarding active
**Install dependencies:**
bun add postal-mime@2.5.0 mimetext@3.0.27
**Create email worker:**
// src/email.ts
import { EmailMessage } from 'cloudflare:email';
import PostalMime from 'postal-mime';
export default {
async email(message, env, ctx) {
const parser = new PostalMime.default();
const email = await parser.parse(await new Response(message.raw).arrayBuffer());
console.log('From:', message.from);
console.log('Subject:', email.subject);
// Forward to destination
await message.forward('you@gmail.com');
}
};**Configure wrangler.jsonc:**
{
"name": "email-worker",
"main": "src/email.ts",
"compatibility_date": "2025-10-11", // must be >= 2024-09-23 for nodejs_compat
"compatibility_flags": ["nodejs_compat"] // Required! postal-mime needs Node.js compat
}**Deploy and connect:**
bunx wrangler deploy
Dashboard → Email Workers → **Create address** → Select worker
**Add send email binding:**
{
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2025-10-11",
"send_email": [
{
"name": "SES",
"destination_address": "user@example.com"
}
]
}**Send from worker:**
import { EmailMessage } from 'cloudflare:email';
import { createMimeMessage } from 'mimetext';
const msg = createMimeMessage();
msg.setSender({ name: 'App', addr: 'noreply@yourdomain.com' });
msg.setRecipient('user@example.com');
msg.setSubject('Hello!');
msg.addMessage({
contentType: 'text/plain',
data: 'Email body here'
});
const message = new EmailMessage(
'noreply@yourdomain.com',
'user@example.com',
msg.asRaw()
);
await env.SES.send(message);**Load `references/setup-guide.md` for complete walkthrough.**
---
1. **Enable `compatibility_flags: ["nodejs_compat"]`** for postal-mime (requires `compatibility_date >= 2024-09-23`) 2. **Verify destination addresses** before sending 3. **Parse with postal-mime** for email content 4. **Use mimetext** for creating emails 5. **Check message.from** for allowlists 6. **Forward with message.forward()** (not manual) 7. **Handle errors** (email delivery can fail) 8. **Test with real emails** (not just dashboard) 9. **Add MX records** (automatic via dashboard) 10. **Log email activity** for debugging
1. **Never skip `nodejs_compat`** (postal-mime requires the Node.js compat flag) 2. **Never send without verification** (delivery fails) 3. **Never hardcode email addresses** in public code 4. **Never skip parsing** (raw email is hard to work with) 5. **Never ignore spam** (implement allowlists/blocklists) 6. **Never exceed Gmail limits** (500 emails/day to Gmail) 7. **Never skip error handling** (emails can fail) 8. **Never modify DNS manually** (use dashboard) 9. **Never expose email content** in logs (PII) 10. **Never assume instant delivery** (email is async)
---
const allowlist = ['approved@domain.com'];
if (!allowlist.includes(message.from)) {
message.setReject('Not on allowlist');
return;
}
await message.forward('you@gmail.com');const blocklist = ['spam@bad.com'];
if (blocklist.includes(message.from)) {
message.setReject('Blocked');
return;
}
await message.forward('you@gmail.com');const msg = createMimeMessage();
msg.setSender({ addr: 'noreply@yourdomain.com' });
msg.setRecipient(message.from);
msg.setSubject(`Re: ${email.subject}`);
msg.addMessage({
contentType: 'text/plain',
data: 'Thanks for your email!'
});
const reply = new EmailMessage(
'noreply@yourdomain.com',
message.from,
msg.asRaw()
);
await env.SES.send(reply);const parser = new PostalMime.default();
const email = await parser.parse(await new Response(message.raw).arrayBuffer());
for (const attachment of email.attachments) {
console.log('Filename:', attachment.filename);
console.log('Type:', attachment.mimeType);
console.log('Size:', attachment.content.byteLength);
}145 production-ready skills for Claude Code CLI 🔌 Platform / Harness Support These plugins ship as Claude Code marketplace plugins (.claude-plugin/ manifests) and Codex CLI plugins (.codex-plugin/ manifests).
100+ animated React components (Aceternity UI) for Next.js with Tailwind. Use for hero sections, parallax, 3D effects, or…
Secure API authentication with JWT, OAuth 2.0, API keys. Use for authentication systems, third-party integrations,…
Creates comprehensive API changelogs documenting breaking changes, deprecations, and migration strategies for API consumers. Use…
Verifies API contracts between services using consumer-driven contracts, schema validation, and tools like Pact. Use when testing…
Master REST and GraphQL API design principles to build intuitive, scalable, and maintainable APIs that delight developers. Use…
Implements standardized API error responses with proper status codes, logging, and user-friendly messages. Use when building…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.