邮件
邮件系统
基于 Resend 的交易邮件。
概述
InkFlip 使用 Resend 发送交易邮件。所有邮件逻辑在 lib/email.ts 中。
邮件类型
| 邮件 | 触发条件 | 模板 |
|---|---|---|
| 验证邮件 | 用户注册 | emails/verification-email.tsx |
| 密码重置 | 忘记密码请求 | emails/reset-password-email.tsx |
| 欢迎邮件 | 邮箱验证完成后 | 内联 |
| 购买确认 | 支付 webhook | 内联 |
| 订阅到期提醒 | 到期前数天 | 内联 |
| 积分不足提醒 | 余额低于阈值 | 内联 |
| 订阅邮件确认 | 订阅或重新订阅 newsletter | 内联 |
配置
RESEND_API_KEY="re_your_api_key"
RESEND_FROM_EMAIL="InkFlip <noreply@inkflip.ink>"RESEND_FROM_EMAIL 应使用已经在 Resend 验证通过的域名。如果没有设置,生产环境可以 fallback 到:
RESEND_VERIFIED_DOMAIN="inkflip.ink"
RESEND_FROM_NAME="InkFlip"如果要同步 newsletter audience,还需要:
RESEND_AUDIENCE_ID="your-resend-audience-id"开发模式
开发环境无验证域名时,应用会使用 InkFlip <onboarding@resend.dev> 作为发件人 fallback。
生产环境
生产环境需在 Resend 面板验证发件域名,并在 Vercel 设置 RESEND_FROM_EMAIL。同时确认 NEXT_PUBLIC_APP_URL 是正式域名,因为验证邮箱和重置密码链接会用它生成。
Namecheap DNS 设置
- 在 Resend 打开 Domains,添加
inkflip.ink,复制 Resend 为该域名生成的 DNS 记录。 - 在 Namecheap 打开 Domain List →
inkflip.ink→ Advanced DNS。 - 按 Resend 显示的记录逐条添加。记录类型使用 Resend 给出的类型,通常是
TXT和CNAME。Namecheap 的 Host 字段只填主机名前缀,不要填完整域名后缀。例如填_dmarc,不要填_dmarc.inkflip.ink。 - 保存后等待 DNS 生效,再回到 Resend 点击 Verify DNS Records。
- Resend 显示域名验证通过后,生产环境使用:
RESEND_FROM_EMAIL="InkFlip <noreply@inkflip.ink>"
NEXT_PUBLIC_APP_URL="https://inkflip.ink"
BETTER_AUTH_URL="https://inkflip.ink"本地 .env.local 可以继续使用 NEXT_PUBLIC_APP_URL="http://localhost:3000" 方便开发;生产值应配置在部署平台的环境变量里。
邮件模板
模板使用 React Email 组件,位于 emails/ 目录:
// emails/verification-email.tsx
import { Html, Body, Text, Link } from '@react-email/components';
export default function VerificationEmail({ verificationUrl }: { verificationUrl: string }) {
return (
<Html>
<Body>
<Text>点击下方链接验证邮箱:</Text>
<Link href={verificationUrl}>验证邮箱</Link>
</Body>
</Html>
);
}错误处理
所有邮件发送都包裹在 try-catch 中。发送失败会记录日志,并返回受控结果而不是抛出异常:
const result = await sendVerificationEmail(email, token);
if (!result.success) {
// 处理邮件发送失败
}