Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/email-workers/api.md
1# Email Workers API Reference23Complete API reference for Cloudflare Email Workers runtime.45## ForwardableEmailMessage Interface67The main interface passed to email handlers.89```typescript10interface ForwardableEmailMessage {11readonly from: string; // Envelope MAIL FROM (SMTP sender)12readonly to: string; // Envelope RCPT TO (SMTP recipient)13readonly headers: Headers; // Web-standard Headers object14readonly raw: ReadableStream; // Raw MIME message (single-use stream)15readonly rawSize: number; // Total message size in bytes1617setReject(reason: string): void;18forward(rcptTo: string, headers?: Headers): Promise<void>;19reply(message: EmailMessage): Promise<void>;20}21```2223### Properties2425| Property | Type | Description |26|----------|------|-------------|27| `from` | string | Envelope sender (SMTP MAIL FROM) - use for security |28| `to` | string | Envelope recipient (SMTP RCPT TO) |29| `headers` | Headers | Message headers (Subject, Message-ID, etc.) |30| `raw` | ReadableStream | Raw MIME message (**single-use**, buffer first) |31| `rawSize` | number | Message size in bytes |3233### Methods3435#### setReject(reason: string): void3637Reject with permanent SMTP 5xx error. Email not delivered, sender may receive bounce.3839```typescript40if (blockList.includes(message.from)) {41message.setReject('Sender blocked');42}43```4445#### forward(rcptTo: string, headers?: Headers): Promise<void>4647Forward to verified destination. Only `X-*` custom headers allowed.4849```typescript50await message.forward('[email protected]');5152// With custom headers53const h = new Headers();54h.set('X-Processed-By', 'worker');55await message.forward('[email protected]', h);56```5758#### reply(message: EmailMessage): Promise<void>5960Send a reply to the original sender (March 2025 feature).6162```typescript63import { EmailMessage } from 'cloudflare:email';64import { createMimeMessage } from 'mimetext';6566const msg = createMimeMessage();67msg.setSender({ name: 'Support', addr: '[email protected]' });68msg.setRecipient(message.from);69msg.setSubject(`Re: ${message.headers.get('Subject')}`);70msg.setHeader('In-Reply-To', message.headers.get('Message-ID'));71msg.setHeader('References', message.headers.get('References') || '');72msg.addMessage({73contentType: 'text/plain',74data: 'Thank you for your message.'75});7677await message.reply(new EmailMessage(78'[email protected]',79message.from,80msg.asRaw()81));82```8384**Requirements**:85- Incoming email needs valid DMARC86- Reply once per event, recipient = `message.from`87- Sender domain = receiving domain, with DMARC/SPF/DKIM88- Max 100 `References` entries89- Threading: `In-Reply-To` (original Message-ID), `References`, new `Message-ID`9091## EmailMessage Constructor9293```typescript94import { EmailMessage } from 'cloudflare:email';9596new EmailMessage(from: string, to: string, raw: ReadableStream | string)97```9899Used for sending emails (replies or via SendEmail binding). Domain must be verified.100101## SendEmail Interface102103```typescript104interface SendEmail {105send(message: EmailMessage): Promise<void>;106}107108// Usage109await env.EMAIL.send(new EmailMessage(from, to, mimeContent));110```111112## SendEmail Binding Types113114```jsonc115{116"send_email": [117{ "name": "EMAIL" }, // Type 1: Any verified address118{ "name": "LOGS", "destination_address": "[email protected]" }, // Type 2: Single dest119{ "name": "TEAM", "allowed_destination_addresses": ["[email protected]", "[email protected]"] }, // Type 3: Dest allowlist120{ "name": "NOREPLY", "allowed_sender_addresses": ["[email protected]"] } // Type 4: Sender allowlist121]122}123```124125## postal-mime Parsed Output126127postal-mime v2.7.3 parses incoming emails into structured data.128129```typescript130interface ParsedEmail {131headers: Array<{ key: string; value: string }>;132from: { name: string; address: string } | null;133to: Array<{ name: string; address: string }> | { name: string; address: string } | null;134cc: Array<{ name: string; address: string }> | null;135bcc: Array<{ name: string; address: string }> | null;136subject: string;137messageId: string | null;138inReplyTo: string | null;139references: string | null;140date: string | null;141html: string | null;142text: string | null;143attachments: Array<{144filename: string;145mimeType: string;146disposition: string | null;147related: boolean;148contentId: string | null;149content: Uint8Array;150}>;151}152```153154### Usage155156```typescript157import PostalMime from 'postal-mime';158159const buffer = await new Response(message.raw).arrayBuffer();160const email = await PostalMime.parse(buffer);161162console.log(email.subject);163console.log(email.from?.address);164console.log(email.text);165console.log(email.attachments.length);166```167168## mimetext API Quick Reference169170mimetext v3.0.27 composes outgoing emails.171172```typescript173import { createMimeMessage } from 'mimetext';174175const msg = createMimeMessage();176177// Sender178msg.setSender({ name: 'John Doe', addr: '[email protected]' });179180// Recipients181msg.setRecipient('[email protected]');182msg.setRecipients(['[email protected]', '[email protected]']);183msg.setCc('[email protected]');184msg.setBcc(['[email protected]']);185186// Headers187msg.setSubject('Meeting Notes');188msg.setHeader('In-Reply-To', '<previous-message-id>');189msg.setHeader('References', '<msg1> <msg2>');190msg.setHeader('Message-ID', `<${crypto.randomUUID()}@example.com>`);191192// Content193msg.addMessage({194contentType: 'text/plain',195data: 'Plain text content'196});197198msg.addMessage({199contentType: 'text/html',200data: '<p>HTML content</p>'201});202203// Attachments204msg.addAttachment({205filename: 'report.pdf',206contentType: 'application/pdf',207data: pdfBuffer // Uint8Array or base64 string208});209210// Generate raw MIME211const raw = msg.asRaw(); // Returns string212```213214## TypeScript Types215216```typescript217import {218ForwardableEmailMessage,219EmailMessage220} from 'cloudflare:email';221222interface Env {223EMAIL: SendEmail;224EMAIL_ARCHIVE: KVNamespace;225ALLOWED_SENDERS: KVNamespace;226}227228export default {229async email(230message: ForwardableEmailMessage,231env: Env,232ctx: ExecutionContext233): Promise<void> {234// Fully typed235}236};237```238