← 返回博客

AI 应用的事务邮件(2026):验证码、邀请与登录链接

AI 应用常见的四类账号邮件:验证码、邮箱验证链接、魔法登录与团队邀请,以及如何用一条 POST /emails 在 Rovela 上投递,令牌与核销仍由应用自己负责。

更新于 2026年11月4日
AI 应用的事务邮件(2026):验证码、邀请与登录链接

AI 应用真正需要发的邮件

如果你在搭一款 AI 产品——对话界面、Agent、薄后端——上线前几乎都会撞上这四类邮件:

  1. OTP / 验证码 — 注册或登录时的六位数字。
  2. 邮箱验证链接 — 点链接确认地址(不是手输验证码)。
  3. 魔法登录链接 — 免密登录、给回访用户开会话。
  4. 团队邀请 — 「加入这个工作区」并带上接受 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 即可。

下一步

  1. 验证发信域名,创建 sending_access 密钥。
  2. 按官方 验证码示例 先把 OTP 跑通。
  3. 验证链接、魔法登录、邀请,都复用 密码重置 的链接模式。
  4. 实现时再读对应深挖文章:

一条 POST /emails 就能盖住多数 AI 应用的账号邮件面。密钥留在你的库里,投递给 Rovela。