使用 Resend 发送邮件
通过 Resend 发送事务性邮件。
事务性邮件通过 Resend 配合 React Email 模板发送。一个 sendEmail
辅助函数封装了 Resend 客户端;认证与联系流程会用渲染好的模板调用它。
提供的能力
- 懒初始化的 Resend 客户端(
src/lib/email/index.ts)。 - 用于验证、重置密码与联系消息的 React Email 模板。
- 发件人/支持地址来自
website-config.ts。
重要文件
| 文件 | 作用 |
|---|---|
src/lib/email/index.ts | sendEmail() 辅助函数 + 懒加载 Resend 客户端 |
src/lib/email/templates/verify-email.tsx | 邮箱验证 |
src/lib/email/templates/forgot-password.tsx | 密码重置 |
src/lib/email/templates/contact-message.tsx | 联系表单消息 |
src/lib/email/templates/subscribe-newsletter.tsx | 订阅邮件模板(仅为素材) |
src/config/website-config.ts | fromEmail、supportEmail |
客户端
Resend 客户端在首次使用时才创建,因此应用在没有 RESEND_API_KEY 时也能启动
(在设置之前,发送时才会失败):
let resend: Resend | null = null;
function getResend() {
if (!resend) resend = new Resend(process.env.RESEND_API_KEY);
return resend;
}
export async function sendEmail({ to, subject, react }: SendEmailOptions) {
const { data, error } = await getResend().emails.send({
from: websiteConfig.mail.fromEmail,
to,
subject,
react,
});
// 返回 { success, messageId } 或 { success: false, error }
}sendEmail 不会抛出异常——它返回一个结果对象,由调用方决定如何处理失败。
已接通的流程
模板中真正会发送邮件的有三个流程:
| 流程 | 触发 | 模板 |
|---|---|---|
| 邮箱验证 | 注册(sendOnSignUp: true) | VerifyEmail |
| 密码重置 | 忘记密码请求 | ForgotPassword |
| 联系消息 | 联系表单 POST | ContactMessage |
前两个通过 Better Auth 在 src/lib/auth.ts 中接通
(emailVerification.sendVerificationEmail 与 sendResetPassword);注册要求
验证(requireEmailVerification: true)。联系表单会 POST 到 /api/contact,
该路由用 Zod 校验输入并发送至 websiteConfig.mail.supportEmail。参见
身份认证。
订阅邮件仅为模板。 subscribe-newsletter.tsx 是随附的 React Email 素材,
但没有任何路由会订阅用户、保存地址或发送它——请勿把订阅输入框当作可用
流程。依赖它之前,请自行接通路由 + 存储。
地址
发件人与支持地址都来自 website-config.ts:
mail: {
provider: "resend",
fromEmail: "SoarStarter <noreply@mail.soarstarter.com>",
supportEmail: "contact@soarstarter.com",
},fromEmail 必须位于你在 Resend 中已验证的域名上。supportEmail 是联系表单的
收件人(同时也是站点的联系地址)。
配置
获取 API Key
注册 Resend 账户并创建 API Key,然后在 .env 中设置
RESEND_API_KEY。
验证域名
在 Resend 中添加并验证你的发送域名,然后将 fromEmail 指向它。未验证的域名
无法发送。
测试流程
本地注册一个新账户,确认收到验证邮件,或提交联系表单。
生产注意事项
- 从已验证域名发送,并配置 SPF/DKIM 以保证送达率。
- 留意 Resend 针对你用量的发送限额/套餐。
- 监控失败:
sendEmail返回{ success: false, error }而非抛错——请在调用处 记录日志。 - 关键邮件可考虑重试/队列;该辅助函数为同步内联发送。
