使用 Resend 发送邮件

通过 Resend 发送事务性邮件。

事务性邮件通过 Resend 配合 React Email 模板发送。一个 sendEmail 辅助函数封装了 Resend 客户端;认证与联系流程会用渲染好的模板调用它。

提供的能力

  • 懒初始化的 Resend 客户端(src/lib/email/index.ts)。
  • 用于验证、重置密码与联系消息的 React Email 模板。
  • 发件人/支持地址来自 website-config.ts

重要文件

文件作用
src/lib/email/index.tssendEmail() 辅助函数 + 懒加载 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.tsfromEmailsupportEmail

客户端

Resend 客户端在首次使用时才创建,因此应用在没有 RESEND_API_KEY 时也能启动 (在设置之前,发送时才会失败):

src/lib/email/index.ts
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: trueVerifyEmail
密码重置忘记密码请求ForgotPassword
联系消息联系表单 POSTContactMessage

前两个通过 Better Auth 在 src/lib/auth.ts 中接通 (emailVerification.sendVerificationEmailsendResetPassword);注册要求 验证(requireEmailVerification: true)。联系表单会 POST 到 /api/contact, 该路由用 Zod 校验输入并发送至 websiteConfig.mail.supportEmail。参见 身份认证

订阅邮件仅为模板。 subscribe-newsletter.tsx 是随附的 React Email 素材, 但没有任何路由会订阅用户、保存地址或发送它——请勿把订阅输入框当作可用 流程。依赖它之前,请自行接通路由 + 存储。

地址

发件人与支持地址都来自 website-config.ts

src/config/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 } 而非抛错——请在调用处 记录日志。
  • 关键邮件可考虑重试/队列;该辅助函数为同步内联发送。

相关页面

On this page