邮件
邮件系统
基于 Zoho ZeptoMail 的交易邮件。
概述
Sistine Starter 使用 Zoho ZeptoMail HTTPS API 发送交易邮件。所有邮件逻辑在 lib/email.ts 中;Newsletter 订阅状态继续保存在本地数据库。
邮件类型
| 邮件 | 触发条件 | 模板 |
|---|---|---|
| 验证邮件 | 用户注册 | lib/email.ts 中的内联 HTML |
| 密码重置 | 忘记密码请求 | lib/email.ts 中的内联 HTML |
| 欢迎邮件 | 邮箱验证完成后 | 内联 |
| 购买确认 | 支付 webhook | 内联 |
| 订阅到期提醒 | 到期前数天 | 内联 |
| 积分不足提醒 | 余额低于阈值 | 内联 |
配置
ZEPTOMAIL_SEND_MAIL_TOKEN="your-zeptomail-send-mail-token"
ZEPTOMAIL_BASE_URL="https://api.zeptomail.com.cn/v1.1"
ZEPTOMAIL_SENDER_EMAIL="Your App <noreply@mail.yourdomain.com>"开发模式
ZeptoMail 不提供开发环境兜底发件人。所有环境都应验证发信域名/Mail Agent 并使用其发件人地址;Send Mail Token 只能保存在服务端。
生产环境
生产环境需按 ZeptoMail 提供的 DNS 记录完成域名验证,创建 Mail Agent,并将 ZEPTOMAIL_SENDER_EMAIL 设置为已验证域名下的发件人。
邮件模板
当前认证和通知邮件使用 lib/email.ts 中的内联 HTML。传输层也支持通过 sendEmail({ react }) 传入 React 元素,在调用 ZeptoMail 前渲染;emails/ 目录中的可复用组件可由显式调用方使用:
// emails/verification-email.tsx
import { Html, Body, Text, Link } from '@react-email/components';
export default function VerificationEmail({ url }: { url: string }) {
return (
<Html>
<Body>
<Text>点击下方链接验证邮箱:</Text>
<Link href={url}>验证邮箱</Link>
</Body>
</Html>
);
}错误处理
所有邮件发送都包裹在 try-catch 中。发送失败会记录日志但不会导致应用崩溃。系统返回 { success, data, error } 结果而非抛出异常:
const result = await sendVerificationEmail(email, token);
if (!result.success) {
// 处理服务商错误,但不要暴露凭据。
}