Resend 免费版只能配置 1 个域名。
如果你只做一个网站,够用。但我现在手里不止一个工具站,一个站一个发信域名,很快就不够了。
所以我换了一个平台:ZeptoMail。
ZeptoMail 是 Zoho 旗下的事务邮件服务,适合发注册验证、找回密码、订单通知这类邮件。
这篇直接按步骤写,怎么注册、怎么配 DNS、怎么拿 Token、怎么接到项目里。
文中用这几个示例:
网站域名:example.com
发信子域名:mail.example.com
发件邮箱:noreply@mail.example.com真实操作时,把它们换成你自己的域名。
1. 先搞清楚要做的验证方式
这里做的不是 6 位数字验证码。
做的是邮箱验证链接。
当然也可以发送数字验证码,只是形式不同。
流程是:
用户注册
→ 系统发送验证邮件
→ 用户点击邮件里的链接
→ 网站把用户标记为已验证
→ 用户继续登录和使用产品对大部分工具站来说,这个就够了。
如果你用 Better Auth、NextAuth、Supabase Auth、Clerk 这类认证系统,一般都内置这种验证链接模式。
2. 注册 ZeptoMail
打开 ZeptoMail:
https://www.zoho.com/zeptomail/如果你用的是 Zoho 中国区,就进中国区对应控制台。
3. 添加发信域名
![[Pasted image 20260729143112.png]]
进入 ZeptoMail 控制台后,找到类似:
Domains然后添加发信域名。
建议不要直接用根域名,而是用子域名:
mail.example.com为什么用子域名?
因为注册验证、找回密码、订单通知都属于系统邮件。用 mail. 子域名发,可以把发信信誉和主站隔开。
发件邮箱后面可以写成:
noreply@mail.example.com如果你的网站是 yourdomain.com,那就用:
mail.yourdomain.com
noreply@mail.yourdomain.com4. 去 Cloudflare 配 DNS
添加域名后,ZeptoMail 会给你几条 DNS 记录。
一般会包含:
- SPF
- DKIM
- TXT
- CNAME
不用自己猜。
ZeptoMail 给什么,就复制什么。
打开 Cloudflare:
Cloudflare -> 选择域名 -> DNS -> Records -> Add record然后按 ZeptoMail 后台给的内容逐条添加。
这里注意几个点:
- Type 要一致,比如 TXT 就选 TXT,CNAME 就选 CNAME。
- Name 不要多填一遍根域名,Cloudflare 有时会自动补全。
- Content 原样复制。
- 如果是 CNAME,通常保持 DNS only,不要开橙云代理。
- MX / TXT 记录没有代理状态,不用管橙云。
添加完以后,回到 ZeptoMail 点验证。
DNS 生效可能需要几分钟,也可能更久。后台显示 verified 之后,再进行下一步。
5. 创建 Mail Agent
域名验证完成后,创建 Mail Agent。
可以理解为:一个项目对应一个发信通道。
![[Pasted image 20260729143312.png]]
6. 生成 Send Mail Token
进入 Mail Agent 后,找到 Send Mail Token。
生成一个新的 Token。
这个 Token 就是项目调用 ZeptoMail API 的密钥。
注意:
- Token 只复制一次。
- 不要发到聊天里。
- 不要写进文章。
- 不要放截图。
- 不要提交到 Git。
项目里会用这个变量保存它:
ZEPTOMAIL_SEND_MAIL_TOKEN=![[Pasted image 20260729143402.png]]
7. 本地项目怎么配置
本地开发放到:
.env.development示例:
EMAIL_PROVIDER=zeptomail
ZEPTOMAIL_BASE_URL=https://api.zeptomail.com.cn/v1.1
ZEPTOMAIL_SEND_MAIL_TOKEN=这里填你的 Send Mail Token
ZEPTOMAIL_SENDER_EMAIL=noreply@mail.example.com
VITE_EMAIL_AUTH_ENABLED=true
VITE_EMAIL_VERIFICATION_ENABLED=true
AUTH_URL=http://localhost:3000
VITE_APP_URL=http://localhost:3000说明一下:
- EMAIL_PROVIDER=zeptomail:告诉项目走 ZeptoMail。
- ZEPTOMAIL_BASE_URL:ZeptoMail API 地址。
- ZEPTOMAIL_SEND_MAIL_TOKEN:发信 Token。
- ZEPTOMAIL_SENDER_EMAIL:发件邮箱。
- VITE_EMAIL_AUTH_ENABLED=true:开启邮箱密码登录。
- VITE_EMAIL_VERIFICATION_ENABLED=true:开启邮箱验证。
- AUTH_URL:认证回调地址。
- VITE_APP_URL:网站地址。
本地测试时,AUTH_URL 和 VITE_APP_URL 要写本地地址。
如果这里写成生产域名,本地注册后,邮件里的验证链接会跳到线上网站。
9. 生产环境怎么配置
生产环境建议分两类配置。
非敏感变量放到 wrangler.jsonc:
{
"vars": {
"EMAIL_PROVIDER": "zeptomail",
"ZEPTOMAIL_BASE_URL": "https://api.zeptomail.com.cn/v1.1",
"ZEPTOMAIL_SENDER_EMAIL": "noreply@mail.example.com",
"VITE_EMAIL_AUTH_ENABLED": "true",
"VITE_EMAIL_VERIFICATION_ENABLED": "true",
"AUTH_URL": "https://example.com",
"VITE_APP_URL": "https://example.com"
}
}敏感变量放 Cloudflare Worker Secret:
pnpm exec wrangler secret put ZEPTOMAIL_SEND_MAIL_TOKEN如果还没设置认证密钥,也一起设置:
pnpm exec wrangler secret put AUTH_SECRETCloudflare Secret 写入后,控制台不会再显示完整值。
这正常。
以后要换 Token,就在 ZeptoMail 重新生成,再执行一次 wrangler secret put 覆盖。
代码如何接入?让AI去做,这里不需要关心这种细节。
如图,可以发送验证邮件了,其他系统通知也可以去发送,比如订阅,到期,活动。
![[Pasted image 20260729143838.png]]