AI 应用的事务邮件(2026):验证码、邀请与登录链接
AI 应用常见的四类账号邮件:验证码、邮箱验证链接、魔法登录与团队邀请,以及如何用一条 POST /emails 在 Rovela 上投递,令牌与核销仍由应用自己负责。
AI 应用真正需要发的邮件
如果你在搭一款 AI 产品——对话界面、Agent、薄后端——上线前几乎都会撞上这四类邮件:
- OTP / 验证码 — 注册或登录时的六位数字。
- 邮箱验证链接 — 点链接确认地址(不是手输验证码)。
- 魔法登录链接 — 免密登录、给回访用户开会话。
- 团队邀请 — 「加入这个工作区」并带上接受 URL。
这些都是事务邮件,不是营销信。它们要快、可信,也不该为每种流程各造一套 API。Rovela 负责投递:域名 DKIM、重试、退信处理,以及事后可查的 message id。应用负责所有安全敏感部分:生成验证码或令牌、存哈希、设过期、一次性核销。
官方示例里,验证码和「重置类链接」分别写在:
魔法登录、邀请、点链接验邮箱,都是建立在同一条发信接口上的应用侧模式,不是 Rovela 的独立产品功能。
一条接口:POST /emails
上面四类账号邮件,HTTP 请求是同一条。用 sending_access 密钥鉴权(见 Send Email):
curl -X POST https://api.rovela.dev/emails \
-H "Authorization: Bearer re_your_sending_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: auth-alice-8f3a2c71" \
-d '{
"from": "Acme <security@mail.acme.com>",
"to": "alice@example.com",
"subject": "Your Acme sign-in code: 482913",
"html": "<p>Your code is <b>482913</b>. It expires in 10 minutes.</p>",
"text": "Your code is 482913. It expires in 10 minutes."
}'
返回 200 且带上 {"object":"email","id":"…"},只表示消息已入队,不等于已经进收件箱。安全类邮件务必同时给 html 和 text——很多客户端用纯文本做通知预览,验证码和 URL 往往是在那里被读到的。
from 使用已验证的子域(例如 mail.yourdomain.com),把安全流量和根域营销流量拆开;每次逻辑发送配一个新的 Idempotency-Key,超时重试时就不会发出两个互相矛盾的验证码。
验证码:什么时候用
用户已经在能打字的设备上时,用短数字码:手机注册、桌面登录挑战、「确认是你本人」。用密码学安全的随机数生成,只存带密钥的哈希(服务端 pepper 的 HMAC),分钟级过期,并限制尝试次数。Rovela 负责把邮件送出去,不会签发或校验这串数字。
完整的 Node / Python 流程——表结构、常量时间比较、重发限制——见文档 邮箱验证码。产品向的投递路径概览可参考 用邮件 API 发送 OTP。
主题写清楚(Your Acme code: 482913),正文两种格式都放上码。OTP 没有可点链接,不必依赖点击追踪。
验证链接 vs 验证码
验证链接证明邮箱属于用户,却不用抄六位数字。应用生成高熵令牌,存哈希与过期时间,发出绝对 URL,例如 https://app.acme.com/verify?token=…。用户打开页面后比对哈希、标记已验证,并作废令牌。
适合用户在手机上、来回切应用很痛苦,或 OAuth / 填邮箱后希望一键确认的场景。适合验证码的情况则是:必须停在同一屏(内嵌 WebView、自助终端,或打开邮箱会丢掉上下文)。
令牌生命周期对齐 密码重置 示例:落库只存哈希、短 TTL、一次性使用。展开说明见 邮箱验证链接。
务必在纯文本里写完整 URL。若别处开了点击追踪,验证链接应关闭追踪(或单独子域发送),避免目的地被改写。
魔法登录链接
魔法登录仍是链接模式,目标换成创建会话,而不是「标记邮箱已验证」。用户请求登录 → 你存一次性令牌 → 发邮件 → 核销后建会话并销毁令牌。
不要虚构 Rovela「魔法登录 API」——没有这种接口。令牌表在你这边;投递仍是 POST /emails。主题写清将发生的事(「登录 Acme」),别做成营销口吻。完整步骤见 魔法登录邮件链接。
按地址与 IP 限流。已核销或过期的令牌统一返回模糊失败信息,避免被用来探测有效性。
团队邀请
邀请是带角色元数据的链接邮件:工作区 id、被邀邮箱、角色、过期时间。生成令牌,发出 https://app.acme.com/invites/accept?token=…,接受时把用户挂到团队。若对方还没有账号,先创建或引导注册,并绑定这封邀请。
注意:Rovela 控制台里邀请仪表盘协作者,和你产品里的终端用户邀请不是一回事。产品邀请只是又一次事务发送。细节与坑(进错邮箱、角色提升、撤销邀请)见 团队邀请邮件链接。
用可识别的 from(邮件子域),在 HTML 与 text 里写清是谁邀请、进哪个工作区。
几条共用规则
上面每一种流程都适用:
| 规则 | 原因 |
|---|---|
同时给 html 与 text | 预览与剥离 HTML 的客户端仍能看到码 / URL |
Idempotency-Key | 重试不能再发出第二份有效密钥 |
| 已验证子域 | 隔离认证信誉与 newsletter |
| 链接类邮件关掉追踪 | 目的地必须仍是你的 URL |
把 200 当成入队 | 需要送达确定性时用 Webhook 或控制台 |
| 尊重抑制列表 | 抑制地址会 400——重发前先处理 |
计划与额度只看 定价页,不要把会变的数字写死。发 OTP / 链接的机器用最小权限的 sending_access 即可。
下一步
一条 POST /emails 就能盖住多数 AI 应用的账号邮件面。密钥留在你的库里,投递给 Rovela。