邮件发送
Resend 和 Zeabur Email 集成,邮件发送与配置指南
概览
@01mvp/email 是一个邮件发送工具,帮你用代码给用户发邮件。当前支持 Resend 和 Zeabur Email,你不需要自己维护邮件服务器。
- 发送验证邮件 -- 用户注册时发验证码或验证链接
- 发送密码重置邮件 -- 用户忘记密码时发重置链接
- 发送邀请邮件 -- 团队成员邀请
- 发送通知邮件 -- 订单确认、活动通知等
- 反馈邮件 -- 把站内反馈直接发到指定收件箱
- 批量发送 -- Zeabur Email REST API 支持批量任务
RESEND_API_KEY、ZEABUR_EMAIL_API_KEY 都是敏感信息,不要提交到 Git。生产环境请放在部署平台的环境变量里。
邮件模板预览
本地开发时可以在网页里统一查看邮件模板样式,不需要真实发送邮件。
pnpm dev启动后打开:
http://localhost:7001/admin/email预览页支持切换模板和语言,也会展示邮件主题、纯文本版本,以及带 unsubscribeUrl 时生成的退订邮件头。常用入口:
http://localhost:7001/admin/email?template=magicLink&locale=zh
http://localhost:7001/admin/email?template=forgotPassword&locale=en环境变量
| 变量名 | 必填 | 说明 |
|---|---|---|
RESEND_API_KEY | 使用 Resend 时必填 | Resend API Key,re_ 开头 |
ZEABUR_EMAIL_API_KEY | 使用 Zeabur 时必填 | Zeabur Email API Key,zs_ 开头 |
EMAIL_FROM | 是 | 发件人地址,必须已在对应平台验证过域名 |
CONTACT_EMAIL | 否 | 站内反馈默认投递的邮箱地址,也是订单通知的默认收件人 |
ORDER_NOTIFICATION_EMAIL | 否 | 订单通知收件人覆盖项,未配置时回退到 CONTACT_EMAIL |
ORDER_NOTIFICATION_EMAIL 不是必填变量。早期产品建议先用 CONTACT_EMAIL 统一接收反馈和订单通知;只有当订单通知需要发给不同邮箱或多个邮箱时,再配置它。多个邮箱可以用逗号、空格或分号分隔。
Resend 配置(推荐)
注册并获取 API Key
访问 Resend,注册账号后在 API Keys 页面创建一个新的 Key。
验证发件域名(可选但推荐)
在 Resend 后台的 Domains 中添加你的域名,按提示配置 DNS 记录。验证通过后,EMAIL_FROM 可以使用该域名下的地址。
配置环境变量
RESEND_API_KEY=re_xxxxxxxxxxxxx
EMAIL_FROM=noreply@yourdomain.com代码示例
import { createEmailProvider } from "@01mvp/email";
const provider = createEmailProvider("resend", {
apiKey: process.env.RESEND_API_KEY!,
defaultFrom: process.env.EMAIL_FROM,
});
await provider.send({
to: "user@example.com",
subject: "验证邮箱",
html: "<p>点击链接验证</p>",
});Zeabur Email 配置(备选)
获取 API Key
在 Zeabur 控制台 中启用 Email 服务,获取 API Key。
验证发件域名
EMAIL_FROM 必须使用在 Zeabur Email 中已验证的发件域名。
配置环境变量
ZEABUR_EMAIL_API_KEY=zs_xxxxxxxxxxxxx
EMAIL_FROM=contact@yourdomain.com
CONTACT_EMAIL=contact@yourdomain.com
# 可选:订单通知单独投递到这些邮箱
ORDER_NOTIFICATION_EMAIL=orders@yourdomain.com,finance@yourdomain.com代码示例
import { createEmailProvider } from "@01mvp/email";
const provider = createEmailProvider("zeabur", {
apiKey: process.env.ZEABUR_EMAIL_API_KEY!,
defaultFrom: process.env.EMAIL_FROM,
});
await provider.send({
to: "contact@yourdomain.com",
subject: "用户反馈",
text: "反馈内容",
replyTo: "user@example.com",
tags: {
type: "feedback",
category: "bug",
},
});Zeabur Email 限制和价格
Zeabur REST API 的限制:
- API 基础地址是
https://api.zeabur.com/api/v1/zsend,请求用 Bearer Token 认证 - 单封邮件接口是
POST /emails,html和text至少需要一个 - 单封邮件的
to + cc + bcc总收件人数最多 50 人 - 主题最长 998 个字符,HTML 和文本内容各最大 5 MB
- 邮件总大小最大 10 MB,附件最多 10 个,单个附件最大 10 MB
- 批量发送接口单次最多 100 封
429和5xx这类临时错误建议指数退避重试;400/403不要反复重试
Zeabur 价格页当前展示的 Email 配额:
| 方案 | 日配额 | 月配额 |
|---|---|---|
| Free | 0 | 0 |
| Dev | 100 | 3,000 |
| Pro | 不限 | 50,000 |
| Team | 不限 | 100,000 |
新用户默认 100 封/天,完成域名验证后默认提升到 1,000 封/天。实际可用额度以 Zeabur 控制台展示为准。
工作原理
- 你的代码调用
createEmailProvider('zeabur')或createEmailProvider('resend'),传入 API Key - 调用
.send()方法,告诉它发给谁、标题是什么、邮件内容(HTML 格式) - 底层拼装好邮件,通过对应服务的 API 发出去
- 返回一个结果告诉你成功还是失败,以及失败原因