Sending email from a Cloudflare Worker, without a third party
Most results for this still tell you to use MailChannels. It was withdrawn in 2024. Here is what works now, and the two bugs that let curl pass while every real submission failed.

A static site needs somewhere to POST a contact form. On Cloudflare that used to mean MailChannels, which offered free sending from Workers. It was withdrawn in 2024, and a large share of the tutorials still ranking for this are dead ends.
You do not need a third party at all.
Workers can send to verified addresses
If Email Routing is configured on your domain, a Worker can send to any verified destination address on the same account through a send_email binding:
jsonc"send_email": [
{ "name": "SEND_EMAIL", "destination_address": "you@example.com" }
]No API key, no separate account, no monthly sending quota to outgrow. The binding is pinned to one recipient, which also means a compromised Worker cannot be turned into a spam relay.
Set Reply-To to the person who filled the form, so hitting reply in your inbox answers them rather than you.

Two things that break it silently
Both of these passed our curl tests and failed every real browser submission.
First: if you serve a static site from Workers assets, the asset router answers /api/* with your 404 page before the Worker ever runs.
jsonc"assets": {
"directory": "./out",
"binding": "ASSETS",
"run_worker_first": ["/api/*"]
}Every other path keeps the default, so a matching static file is still served without waking the Worker at all.
Second, and this one cost us longer: trailing slashes.
ts// trailingSlash: true means the browser posting to
// action="/api/contact" actually requests "/api/contact/"
const route = pathname.replace(/\/+$/, "") || "/";Store before you send
Write the submission to KV before attempting the email. If delivery fails — a rate limit, an outage, a misconfigured sender — you still have the lead.
Losing an enquiry quietly is the most expensive bug a contact form can have, and it is the default behaviour of almost every implementation.
This is what we do
Work of this kind is Web Development and API & Integrations — the same hands that wrote this.
Written by Taha Virdiwala at RiverPoint Web & App. Everything here was measured on a real build — if you are hitting the same thing and it is not landing, tell us what you are seeing.


