InkFlip Docs
邮件

邮件系统

基于 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 设置

  1. 在 Resend 打开 Domains,添加 inkflip.ink,复制 Resend 为该域名生成的 DNS 记录。
  2. 在 Namecheap 打开 Domain Listinkflip.inkAdvanced DNS
  3. 按 Resend 显示的记录逐条添加。记录类型使用 Resend 给出的类型,通常是 TXTCNAME。Namecheap 的 Host 字段只填主机名前缀,不要填完整域名后缀。例如填 _dmarc,不要填 _dmarc.inkflip.ink
  4. 保存后等待 DNS 生效,再回到 Resend 点击 Verify DNS Records
  5. 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) {
  // 处理邮件发送失败
}

On this page