MailKit中收件箱与已发送邮件的关联及未回复邮件获取方法
针对InReplyTo字段无法覆盖所有已回复邮件的问题,可以尝试以下几种方法:
利用
References字段关联邮件对话
多数邮件客户端在回复时,会在References头中包含原始邮件的Message-ID,甚至整个对话的邮件ID链。你可以遍历收件箱的所有邮件,记录每封邮件的Message-ID,然后检查是否存在其他邮件的InReplyTo或References包含这个ID——如果没有,说明该邮件未被回复。这个字段的覆盖范围比InReplyTo更广,能解决部分InReplyTo为null的情况。读取邮件客户端的自定义状态属性
像Outlook这类客户端会给已回复的邮件添加特定的MAPI属性标记:比如PR_LAST_VERB_EXECUTED(属性标签为0x10810003),当值为102时代表邮件已被回复。用JavaMail或其他邮件库可以直接读取这类扩展属性,以此判断邮件状态。示例代码片段:// 读取Outlook的已回复标记 Integer verb = (Integer) msg.getHeader("http://schemas.microsoft.com/mapi/proptag/0x10810003")[0]; boolean isReplied = verb != null && verb == 102;分析邮件主题前缀
绝大多数回复邮件的主题会带有Re:、回复:、FW:(转发也算关联互动)这类前缀。你可以提取原邮件的核心主题(去掉可能存在的前缀),然后在收件箱中搜索是否有主题包含该核心内容的邮件。虽然这种方法存在用户手动修改主题的误差,但可以作为前两种方法的补充。通过
Thread-Index字段分组对话
部分邮件系统(如Exchange)会使用Thread-Index头字段,同一对话的所有邮件会共享关联的Thread-Index值。你可以按这个字段对邮件分组,若某组中只有原始邮件、没有其他后续邮件,则判定该邮件未被回复。
内容的提问来源于stack exchange,提问作者Anrew Vishnyakov

