用 Resend 发送域名邮件
Resend 主要解决应用或脚本向外发送邮件的问题。它不提供传统意义上的完整邮箱服务,但可以使用已经验证的域名作为发件域名,通过 API 发送邮件。
如果域名的收信部分已经交给 Cloudflare Email Routing,那么可以组合成:
发信:应用 / Worker → Resend → 域名邮箱
收信:域名邮箱 → Cloudflare Email Routing → Gmail
这样不需要自己维护 SMTP、IMAP、反垃圾邮件和邮件投递基础设施。
一、准备工作
需要准备:
- 一个自己的域名;
- 域名 DNS 托管在 Cloudflare;
- 一个 Resend 账号;
- 一个用于接收测试邮件的 Gmail 或其他邮箱。
本文统一使用以下示例数据:
域名:example.com
发件地址:[email protected]
收件地址:[email protected]
以上地址均为示例,实际使用时替换为自己的信息。
二、在 Resend 添加域名
登录 Resend,进入域名管理页面,添加自己的域名:
example.com
Resend 会根据当前配置生成 DNS 记录。需要按照 Resend 控制台显示的内容,在 Cloudflare DNS 中添加对应记录,不要自行猜测记录值。
配置完成后,返回 Resend 对域名进行验证。验证成功后,通常会看到类似状态:
example.com
Verified
这表示 Resend 已经获得代表该域名发送邮件的权限。
三、创建 Resend API Key
进入 Resend 的 API Key 页面,创建一个新的 API Key。
示例:
re_xxxxxxxxxxxxxxxxxxxxxxxxx
API Key 是程序调用 Resend API 的认证凭据,不要:
- 提交到 GitHub;
- 写死在前端 JavaScript;
- 发布到博客;
- 发给其他人;
- 写进公开配置文件。
如果程序运行在服务器或 Cloudflare Worker 上,应使用环境变量或 Secret 保存:
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxx
文章、代码仓库和日志中只保留占位符。
四、使用 curl 测试发送邮件
域名验证和 API Key 创建完成后,可以先不写程序,直接使用 curl 测试 Resend API:
curl -X POST 'https://api.resend.com/emails' \
-H 'Authorization: Bearer YOUR_RESEND_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"from": "[email protected]",
"to": ["[email protected]"],
"subject": "Resend 测试",
"html": "<h1>Hello</h1><p>这是通过 Resend 发送的测试邮件。</p>"
}'
需要替换:
YOUR_RESEND_API_KEY
同时把发件地址替换成已经通过 Resend 验证的域名下的地址,例如:
具体可用的发件地址,以 Resend 当前域名验证状态和发送策略为准。
五、容易踩坑:Shell 多行命令换行
如果把 curl 写成多行,反斜杠 \ 必须是这一行的最后一个字符。
正确写法:
curl -X POST 'https://api.resend.com/emails' \
-H 'Authorization: Bearer YOUR_RESEND_API_KEY' \
-H 'Content-Type: application/json'
错误写法:
curl -X POST 'https://api.resend.com/emails' \
第二种写法中,反斜杠后面存在空格。Bash 不会把下一行继续拼接起来,可能出现:
Missing API Key
-H: command not found
-d: command not found
遇到这种错误时,先检查反斜杠后面是否存在空格或其他不可见字符。
六、判断发送是否成功
如果 API 调用成功,Resend 会返回一个邮件 ID:
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
这表示 Resend 已经接受了邮件发送请求。之后还需要检查目标邮箱是否实际收到邮件。
如果没有收到,可以检查:
- Resend 控制台中的邮件日志;
- DNS 配置;
- SPF;
- DKIM;
- DMARC;
- 目标邮箱的垃圾邮件文件夹。
“API 返回邮件 ID”只代表发送请求被接受,不等于邮件已经进入收件箱。
七、配置 Cloudflare Email Routing 接收邮件
Resend 解决的是发信。如果还希望:
能够接收邮件,可以使用 Cloudflare Email Routing。
在 Cloudflare 中开启 Email Routing,并添加地址:
再指定最终目标邮箱:
收信链路如下:
别人发送邮件
│
▼
[email protected]
│
▼
Cloudflare Email Routing
│
▼
[email protected]
这样 Gmail 就成为实际的个人收件箱。
八、使用 Cloudflare Worker 处理邮件
如果只是简单转发邮件,Cloudflare Email Routing 本身就可以完成。如果希望对邮件进行进一步处理,例如:
- 根据主题分类;
- 保存邮件内容;
- 调用其他 API;
- 发送通知;
- 过滤特定邮件;
- 自定义邮件处理逻辑。
可以加入 Cloudflare Worker:
[email protected]
│
▼
Cloudflare Email Routing
│
▼
Cloudflare Worker
│
├── 处理
├── 过滤
└── 转发
│
▼
Gmail
Worker 不是 Resend 发信所必需的组件,只有在需要自定义收信逻辑时才需要加入。
九、最终邮件架构
完成发信和收信配置后,可以得到一套轻量的个人域名邮件链路:
example.com
│
┌─────────────┴─────────────┐
│ │
Outbound Inbound
│ │
Resend Cloudflare Email
Routing
│ │
│ Worker
│ │
▼ ▼
[email protected] ──────────────→ Gmail
各组件职责如下。
Resend
负责发送邮件,通过 API 调用:
POST https://api.resend.com/emails
Cloudflare Email Routing
负责接收发往域名邮箱的邮件,并转发到最终收件地址。
Cloudflare Worker
负责自定义邮件处理,例如过滤、分类、保存和发送通知。
Gmail
作为最终收件箱。
十、是否需要自己写邮件程序
测试阶段不需要写程序:
curl
↓
Resend API
↓
目标邮箱
这样就可以完成最小化的发信验证。
只有当网站或应用需要自动发送邮件时,才需要在后端或 Cloudflare Worker 中调用 Resend API。
例如网站表单:
用户提交网站表单
│
▼
Cloudflare Worker
│
▼
Resend API
│
▼
[email protected]
十一、网站联系表单场景
如果给个人网站增加“联系我”功能,可以采用以下结构:
访客
│
│ 提交留言
▼
网站前端
│
▼
Cloudflare Worker
│
│ RESEND_API_KEY
▼
Resend
│
▼
[email protected]
│
▼
Cloudflare Email Routing
│
▼
Gmail
整个邮件发送过程不需要把 Resend API Key 暴露给浏览器。
错误做法:
浏览器
│
└── Resend API
↑
API Key 暴露
正确做法:
浏览器
│
▼
Cloudflare Worker
│
│ API Key 保存在 Secret
▼
Resend
浏览器只负责提交表单,Worker 负责使用 Secret 调用 Resend。
十二、注意事项
1. API Key 不要泄露
如果 API Key 意外出现在以下位置:
- GitHub;
- 日志;
- 截图;
- 聊天记录;
- 博客文章。
应该立即撤销旧 Key,并重新创建新的 API Key。
2. 发件地址必须使用已验证域名
例如验证的是:
example.com
那么通常可以使用:
具体规则以 Resend 当前控制台和发送策略为准。
3. 收信和发信是两个独立的问题
不要把 Resend 理解成传统邮箱服务。它主要解决:
应用 → 邮件
Cloudflare Email Routing 解决的是:
邮件 → 你的邮箱
因此两者可以组合使用:Resend 负责发信,Cloudflare Email Routing 负责收信,Worker 负责需要定制的邮件处理逻辑。
十三、最小验证流程
只想把发信流程跑通时,只需要:
① 域名
↓
② Resend 添加并验证域名
↓
③ 创建 API Key
↓
④ curl 调用 Resend API
↓
⑤ 收到测试邮件
如果还需要接收邮件,再继续配置:
⑥ Cloudflare 开启 Email Routing
↓
⑦ [email protected] → Gmail
↓
⑧ 使用外部邮箱发送邮件到 [email protected]
这套方案把发信、收信和邮件处理拆成了相互独立的组件,出问题时也更容易定位。