---
url: /docs/email.md
---
# 邮件发送

## 结构

邮件模板在 `apps/email/`，API 的 `apps/api/lib/email.ts` 提供验证邮件、密码重置和验证码的发送函数。模板导出同时生成 HTML 与纯文本，所有发送经过 `sendEmail()`。

```sh
bun email:dev
bun email:build
bun email:export
```

模板预览默认使用 3001 端口。构建先生成邮件包，再让接口引用；根目录 `bun build` 已按依赖处理。

## 两种发送模式

完整本地预览捕获 Resend 请求，将记录写入被忽略的 `.local/outbox.jsonl`，不调用真实发送接口。`bun dev` 和线上 Worker 使用真实 Resend。

真实发送需要有效 `RESEND_API_KEY`、`RESEND_EMAIL_FROM` 和已验证发信域。先测试普通邮箱、垃圾邮件和退信，再验证认证链接；不要把本地捕获成功当成投递成功。

## 新增模板

创建模板并从邮件包导出，在 API 增加对应封装，传入站点品牌和正确网址。模板要有纯文本版本，链接地址从可信配置派生，不接受任意外部回跳地址。

组织邀请尚未配置发送回调，需要增加模板和插件衔接后再验收。通知、营销邮件与退订管理也不是现有事务邮件自动具备的能力。

## 排查

先确认运行模式，再检查配置、模板构建、发送返回错误和投递记录。`sendEmail()` 验证所有收件人；服务返回错误会继续抛出，调用方需要显示或处理失败。

邮箱、验证码和重置链接属于敏感记录，本地排查后不提交收件箱文件；生产日志不能打印完整验证码或认证链接。
