Send emails from Workers
Beta
You can send an email about your Worker’s activity from your Worker to an email address verified on Email Routing. This is useful for when you want to know about certain types of events being triggered, for example.
Before you can bind an email address to your Worker, you need to enable Email Routing and have at least one verified email address. Then, create a new binding in the wrangler.toml
file:
send_email = [ {type = "send_email", name = "<NAME_FOR_BINDING>", destination_address = "<YOUR_EMAIL>@example.com"},
]
Types of bindings
There are three types of bindings:
- No attribute defined: When you do not define an attribute, the binding has no restrictions in place. You can use it to send emails to any verified email address through Email Routing.
destination_address
: When you define thedestination_address
attribute, you create a targeted binding. This means you can only send emails to the chosen email address. For example,{type = "send_email", name = "<NAME_FOR_BINDING>", destination_address = "<YOUR_EMAIL>@example.com"}
.
For this particular binding, when you call thesend_email
function you can passnull
orundefined
to your Worker and it will assume the email address specified in the binding.allowed_destination_addresses
: When you specify this attribute, you create an allowlist, and can send emails to any email address on the list.
You can add one or more types of bindings to your wrangler.toml
file. However, each attribute must be on its own line:
send_email = [ {type = "send_email", name = "<NAME_FOR_BINDING1>"}, {type = "send_email", name = "<NAME_FOR_BINDING2>", destination_address = "<YOUR_EMAIL>@example.com"}, {type = "send_email", name = "<NAME_FOR_BINDING3>", allowed_destination_addresses = ["<YOUR_EMAIL>@example.com", "<YOUR_EMAIL2>@example.com"]},
]
Example Worker
Refer to the example below to learn how to construct a Worker capable of sending emails. This example uses MIMEText:
import { EmailMessage } from "cloudflare:email";
import { createMimeMessage } from "mimetext";
function toReadableStream(value) { return new ReadableStream({ start(controller) { var enc = new TextEncoder(); controller.enqueue(enc.encode(value)); controller.close(); }, });
}
export default { async fetch(request, env) { const msg = createMimeMessage(); msg.setSender({ name: "GPT-4", addr: "<SENDER>@example.com" }); msg.setRecipient("<RECIPIENT>@example2.com"); msg.setSubject("An email generated in a worker"); msg.setMessage( "text/plain", `Congratulations, you just sent an email from a worker.` );
var message = new EmailMessage( "<SENDER>@example.com", "<RECIPIENT>@example.com", toReadableStream(msg.asRaw()) ); try { await env.SEB.send(message); } catch (e) { return new Response(e.message); }
return new Response("Hello Send Email World!"); },
};