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。稳定、便宜、安全、可扩展,没有任何架构风险。

相关推荐
Benny的老巢1 天前
Cloudflare Workers 接口服务能力详解
cloudflare·服务端·workers·接口服务·d1数据库
Benny的老巢1 天前
Cloudflare Workers CORS 跨域问题排查与解决
跨域·cloudflare·cors·workers
大佐不会说日语~2 天前
使用 Cloudflare平台 + Docker + Nginx 完成网站 HTTPS 部署实战记录
nginx·docker·https·部署·cloudflare
wanfeng_092 天前
nextjs cloudflare 踩坑日记
nextjs·cloudflare
Irene199123 天前
SharedArrayBuffer is not defined
workers
xuchaoxin13751 个月前
cdn节点代理的副作用@fail2ban对接cdn封锁恶意请求ip@fail2ban封锁ip有效性问题
运维·网络·cdn·cloudflare
QC七哥2 个月前
使用wrangler发布cf的workers项目
workers·站点部署·wrangler
起个破名想半天了3 个月前
五秒盾解决方案之Selenium
selenium·cloudflare·反爬
Linux运维技术栈4 个月前
域名网页加载慢怎么解决:从测速到优化的全链路性能优化实战
运维·网络·nginx·性能优化·cloudflare