Cloudflare Workers 实现 Resend 邮件发送接口

完全可以,而且非常适合用 Cloudflare Workers 来实现这个需求。这个场景 100% 命中 Workers 的最佳使用场景。

需求拆解 & 可行性评估

你的需求是

  1. 前端页面点击「提交联系方式」

  2. 调用 Cloudflare Workers 提供的 API

  3. 传递字段:

    • 邮箱
    • 用户名
    • 手机号
    • 留言内容
  4. Workers 收到数据

  5. 调用 Resend Email API

  6. 把用户信息发送到指定邮箱

Workers 能否做到?

环节 是否支持 说明
HTTP API 接口 ✅ 原生支持 fetch
POST JSON 数据 ✅ request.json()
调用第三方 API ✅ fetch()
设置 API Key ✅ Secret 环境变量
CORS 支持 ✅ 手动设置 Header
性能 / 稳定性 ✅ 全球边缘
成本 ✅ 非常低

这是一个"教科书级适合 Workers 的业务"。

推荐的整体架构

复制代码
[前端页面]
   |
   | POST /api/contact
   |
[Cloudflare Worker]
   |
   | 调用 Resend API
   |
[目标邮箱]
  • 无服务器
  • 无数据库(可选)
  • 高安全性
  • 几乎零运维

关键安全点

绝对不能

  • 在前端直接调用 Resend API
  • 在前端暴露 Resend API Key

正确做法

  • Resend API Key 存在 Worker 的 Secret 中
  • 前端只请求 Worker
bash 复制代码
wrangler secret put RESEND_API_KEY

Workers 是否会被 Resend 限制?

Resend 官方支持:

  • Edge Runtime
  • fetch API
  • Node / Bun / Workers

完全兼容 Cloudflare Workers。

完整实现方案

Worker API 示例

js 复制代码
export default {
  async fetch(request, env) {
    if (request.method !== 'POST') {
      return new Response('Method Not Allowed', { status: 405 })
    }

    const body = await request.json()

    const { email, name, phone, message } = body

    // 简单校验
    if (!email || !name || !message) {
      return new Response(
        JSON.stringify({ error: 'Missing required fields' }),
        { status: 400 }
      )
    }

    const res = await fetch('https://api.resend.com/emails', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${env.RESEND_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        from: 'Contact Form <no-reply@yourdomain.com>',
        to: ['your@email.com'],
        subject: '新的用户留言',
        html: `
          <h3>新的用户提交</h3>
          <p><b>姓名:</b>${name}</p>
          <p><b>邮箱:</b>${email}</p>
          <p><b>手机号:</b>${phone || '-'}</p>
          <p><b>留言:</b>${message}</p>
        `
      })
    })

    if (!res.ok) {
      const err = await res.text()
      return new Response(err, { status: 500 })
    }

    return new Response(
      JSON.stringify({ success: true }),
      { headers: { 'Content-Type': 'application/json' } }
    )
  }
}

前端调用示例

js 复制代码
await fetch('https://your-worker.workers.dev/api/contact', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: 'user@example.com',
    name: 'Tom',
    phone: '123456789',
    message: '我想了解下你们的服务'
  })
})

进阶建议

CORS 限制

只允许你的域名调用:

js 复制代码
headers: {
  'Access-Control-Allow-Origin': 'https://your-site.com'
}

防垃圾提交(强烈建议)

方案 是否适合
Cloudflare Turnstile ⭐⭐⭐⭐⭐
请求频率限制 ⭐⭐⭐⭐
Honeypot 字段 ⭐⭐⭐

防刷接口

  • 根据 IP 限制
  • 1 分钟最多 N 次

可选:落库(审计用)

如果你后期想保存记录:

  • D1(SQLite)
  • KV(轻量)

是否有"坑"?

需要注意的地方:

  1. 邮件 From 域名要在 Resend 验证
  2. Worker 默认不能用 nodemailer(但你用不上)
  3. HTML 要自己拼(或模板)

都不是问题级别。

最终结论

你的需求非常适合 Cloudflare Workers + Resend。稳定、便宜、安全、可扩展,没有任何架构风险。

相关推荐
boke112百科13 天前
怎么将Cloudflare Pages子域名301跳转到自定义域名?
运维·cloudflare·静态网站·301重定向
請你喝杯Java18 天前
网站部署平台怎么选:Vercel、Cloudflare、ChatGPT Sites 的区别、费用与国内访问
chatgpt·cloudflare·vercel
菜鸡666622 天前
绕过cf验证,部署 FlareSolverr 服务使用request处理
python·cloudflare
Lsetea23 天前
Cloudflare报526 Invalid SSL certificate:源站证书与Nginx回源TLS排查
nginx·https·ssl证书·cloudflare·tls
AbelTomato1 个月前
博客评论系统搭建回顾
javascript·typescript·cloudflare·supabase·hyperdrive
零号栈帧1 个月前
Codex 手机控制台——AgentDeck
windows·cloudflare·codex·pwa·ai agent
啾啾Fun1 个月前
技术动态日报 · 2026年8月25日
cloudflare·ai-agent·技术日报·豆包工作
FungLeo1 个月前
Node 后端实战 · 边缘 Cron 定时任务怎么写?Cloudflare 三个实战任务与踩坑
serverless·边缘计算·定时任务·cloudflare·cron·workers
FungLeo1 个月前
Node 后端实战 · Cloudflare Workers 限流总误伤?用内存固定窗口替代 KV 实战
serverless·cloudflare·接口请求限流·限流内存方案·workes
摆烂菜鸡沧9961 个月前
【项目踩坑记录】Cloudflare部署记录与修改二级域名
cloudflare·网站部署