安全性与撤销访问权限
令牌,而非密码
连接一个助手绝不会把你的 MailInApp 密码或 API 密钥交给它。批准授权确认页面会生成一个 OAuth 访问令牌,其权限范围恰好等于你所勾选的权限,并且恰好绑定到你所选择的账户。令牌是以哈希形式存储的不透明随机字符串——与 MailInApp 已经用于开发者 API 密钥的方式相同——因此读取数据库无法还原出可用的凭证,撤销一个令牌是即时的,无需等待过期。
- 访问令牌有效期为 1 小时。
- 刷新令牌有效期为 60 天,并在每次使用时轮换——旧令牌会在新令牌签发的那一刻立即失效;如果一个已经被轮换过的刷新令牌被重放使用(这是泄露的迹象),整个连接都会被自动撤销,而不仅仅是那一个令牌。
发送前的两步确认
被授予 campaigns:send 并不意味着助手可以一步就给你的联系人发邮件。发送始终要经过两次独立的工具调用:
prepare_send解析你的受众,应用屏蔽名单,并渲染出一份真实预览——被标注为只读,因为它不会发送任何内容。它会返回收件人数量、一份地址样本、渲染后的 HTML,以及一个绑定到该确切项目、主题和受众的短期有效confirmationToken。confirm_send需要那个确切的令牌,以及与它生成时完全相同的项目/主题/受众。任何不匹配的情况——不同的主题、不同的行选择、已过期的令牌(10 分钟窗口)——都会被直接拒绝。
实际效果是:助手无法在不先展示即将发送的内容以及发送对象人数的情况下发送邮件,也无法在向你展示预览和真正发送之间偷换受众或主题。在 Claude 中,prepare_send 的结果会渲染为一张带有自己确认发送按钮的实际卡片——因此人工批准是在一份渲染出的预览上点击一下,而不是聊天记录里模型可以自说自话绕过的一句话。
以这种方式完成的每一次发送,依然要额外经过你账户现有的各项保障机制:你套餐的 connectorSendRecipientsMonthly 上限(与你常规的月度发送量上限相互独立,且远低于后者——Free 为 0)、其他任何发送都会检查的同一份屏蔽名单,以及你账户整体的月度发送上限。每一次发送都会单独记录为一条审计记录。
不可信内容会被标记隔离,而非被信任
联系人字段、收到的域名邮箱邮件正文,以及表单的自由文本答案,都是由你以外的人撰写的——收件人,或者任何给你的支持邮箱写信的人。返回这类内容的工具会在工具结果中把它明确标记为不可信数据,因此你的助手会把它当作需要阅读和总结的内容,而绝不会当作需要遵循的指令。(给技术上感兴趣的读者:这种隔离标记存在于工具的结果中,而绝不会出现在工具的描述中——把行为指令放进描述,正是连接器审核方一眼就会拒绝的那种提示注入攻击面。)
任何工具都永远无法触及的内容
无论你授予了哪些权限范围,任何连接器工具都不能读取或轮换 API 密钥、Webhook 签名密钥、SMTP 密码,或某个已连接数据源的 OAuth 客户端密钥;不能更改支付、域名或 SMTP 设置;也不能管理团队邀请。这些都与 editor 团队成员在 MailInApp 其他地方已经无法触及的范围完全一致。这里的任何操作都不会涉及 Stripe 或账单——一次拒付争议或一次退款仍然只能在仪表盘中操作。
始终重新校验的账户
一个连接在授权同意时就绑定到一个账户,之后永远不会通过重新读取某个请求头来决定要代表哪个账户操作(这与已登录的仪表盘会话可以在多个公司之间切换不同)。这种绑定关系会在每一次调用时,针对你当前的团队成员身份重新校验——如果你被移出某个团队,或者你的角色发生变化,该连接的下一次调用就会立即反映新的现实,而不是你授予权限范围时的情况。
撤销一个连接
前往仪表盘中的连接(/dashboard/connections)。你已批准的每一个助手都会连同其已授予的权限范围和上一次调用时间一起列出;撤销会立即生效——该助手持有的所有令牌,无论是访问令牌还是刷新令牌,都会在下一次调用时失效。不需要先在平台一侧(Claude/Gemini)撤销任何东西;在这里撤销始终是充分的。