客户端通过检查回复的请求头,将其与之前的消息归为一组。In-Reply-To 和 References 中的消息 ID 使客户端能够显示一个完整的对话。
哪些请求头将回复保持在同一会话中?
回复消息将父消息的 Message-ID 放入 In-Reply-To 中,同时在 References 中携带相关消息 ID 的链条。当多个回复从同一消息分支时,客户端可以据此重建对话。
RFC 5322 第 3.6.4 节指出,In-Reply-To 可以标识新消息所回复的一条或多条消息。References 可以标识会话中的相关消息。
会话回复是什么样的?
一条具有 Message-ID: <m1@example.com> 的消息可以收到带有以下请求头的回复:
In-Reply-To: <m1@example.com>
References: <m1@example.com>
对该回复的再次回复会将新的父消息追加到 References 中:
In-Reply-To: <m2@example.com>
References: <m1@example.com> <m2@example.com>
保持每个 ID 与发送方提供的完全一致。不要为父消息编造新的 ID,也不要用主题行来替代。
| 请求头 | 示例值 | 作用 |
|---|---|---|
Message-ID | <reply@example.com> | 标识当前消息 |
In-Reply-To | <original@example.com> | 指明所回复的消息 |
References | <original@example.com> | 携带祖先链 |
以上值为合成示例。仅凭 Re: 主题无法标识父消息。
回复为何会脱离会话?
当 In-Reply-To 和 References 缺失或指向其他消息时,客户端可能会开启一个新对话。更改主题也可能影响分组,因为客户端会将请求头与自身的主题规则结合使用。
转发的消息通常是一个新对话。它包含原始内容以提供上下文,但不会自动将原始消息标识为其父消息。
回复发送给作者或 Reply-To 地址。全部回复还会保留原始的 To 和 Cc 收件人,但受发送方邮箱规则约束。客户端仍然可以对消息进行不同的分组或拆分,因为渲染和分组是客户端行为。
如何通过 Bird 保持会话?
通过 Bird 邮箱回复时,对 POST /v1/email/threads/{thread_id}/messages/{message_id}/reply 处收到的消息调用 replyEmailThreadMessage。该操作使用 mailbox 写入权限范围。Bird 会自动派生主题和回复请求头。发出的消息将留在该会话中。要发起新会话,请使用 compose。邮箱指南展示了回复流程和收件 webhook 事件。
如果你的集成发送原始邮件,请将父消息的 Message-ID 保留在 In-Reply-To 中,并将完整链条保留在 References 中。将这些请求头与消息记录一起存储,以便重试时使用相同的关联关系。
总结
In-Reply-To指明所回复的消息。References携带相关消息链。- 缺失或无关的请求头可能会开启一个新对话。
- Bird 邮箱的回复会留在所收消息的会话中。