Cloudflare Email Routing + Worker
Cloudflare Email Routing + Worker#
架构#
收到邮件 → Email Routing → 触发 Worker → 自定义处理
↓
转发/丢弃/回复/存储/调用APIplaintext1. Email Routing 配置#
Cloudflare Dashboard → Email → Email Routing
↓
Catch-all 地址: *@yourdomain.com → 转发到 Workerplaintext2. Worker 接收邮件#
// worker.js
export default {
async email(message, env, ctx) {
// message: 邮件对象
const {
from, // 发件人
to, // 收件人
headers, // 原始头
raw, // 原始内容
rawSize, // 大小
} = message;
// 读取内容
const text = await message.text();
const html = await message.html();
// 处理逻辑
if (text.includes('验证码')) {
await env.DB.prepare('INSERT INTO codes (email, code) VALUES (?, ?)')
.bind(from, extractCode(text)).run();
}
// 转发到 Gmail
await message.forward('backup@gmail.com');
// 或回复
await message.reply({
from: 'bot@yourdomain.com',
subject: 'Re: ' + message.headers.get('subject'),
text: '收到,处理中...',
});
}
};javascript3. wrangler.toml 配置#
name = "email-worker"
main = "worker.js"
[[email]]
name = "catch-all"
destination = "worker"
# 绑定存储
[[d1_databases]]
binding = "DB"
database_name = "emails"
database_id = "xxx"toml典型场景#
| 场景 | 代码 |
|---|---|
| 自动回复 | message.reply({...}) |
| 过滤垃圾 | if (spamCheck(raw)) message.setReject('Spam') |
| 提取数据 | await message.text() 正则匹配 |
| 存储归档 | await env.R2.put(key, raw) |
| 触发 webhook | fetch('https://api.com/notify', {body: json}) |
总结#
Email Routing 收邮件 → Worker 写代码处理 → 转发/回复/存存储/调API,无服务器邮件自动化。