如何使用EWS Java API查找经Outlook规则重定向的邮件?
解决Outlook重定向邮件后无法通过原始Message-ID查找的问题
嘿,这个场景我之前帮不少开发者处理过——Outlook的规则重定向/转发操作确实会生成新的Message-ID,但其实我们有几个可靠的办法来追踪到B邮箱里的目标邮件:
利用会话ID(ConversationId)精准匹配
这是最可靠的方案!Outlook的会话机制会给同一会话的所有邮件分配一个唯一的ConversationId,不管邮件被重定向、转发多少次,这个ID都不会改变。你只需要:- 先在收件人A的邮箱里,通过原始Message-ID找到对应邮件,获取它的
ConversationId - 用这个
ConversationId作为过滤条件,在B邮箱的EWS查询里搜索,就能直接定位到重定向后的邮件
举个C#的代码片段示例:
// 先从A邮箱获取原始邮件的ConversationId var originalItem = service.FindItems(WellKnownFolderName.Inbox, new SearchFilter.IsEqualTo(ItemSchema.InternetMessageId, originalMessageId), new ItemView(1)).FirstOrDefault(); if (originalItem != null) { // 用ConversationId在B邮箱搜索 var conversationFilter = new SearchFilter.IsEqualTo(ItemSchema.ConversationId, originalItem.ConversationId); var redirectedItems = serviceB.FindItems(WellKnownFolderName.Inbox, conversationFilter, new ItemView(10)); }- 先在收件人A的邮箱里,通过原始Message-ID找到对应邮件,获取它的
通过In-Reply-To/References头字段追踪
当Outlook执行重定向或转发操作时,通常会把原始邮件的Message-ID写入新邮件的InReply-To或References头部字段。你可以直接在B邮箱里搜索这两个字段匹配原始Message-ID的邮件:# 用Exchange Online PowerShell查询示例 $originalMsgId = "<你的原始Message-ID>" Get-EXOMessage -Identity B@domain.com -Filter "InReplyTo -eq '$originalMsgId'"注意:部分极端规则配置可能会修改这些字段,但绝大多数默认场景下都能正常工作。
提前添加自定义追踪属性
如果你的业务场景允许,在发送邮件时给原始邮件添加一个自定义的互联网头字段(比如X-Trace-Id),值设为你自己生成的唯一标识(比如UUID)。这个自定义字段会被Outlook规则保留,后续不管邮件被转发到哪个邮箱,都能通过这个字段精准搜索:// 发送邮件前添加自定义属性 var traceId = Guid.NewGuid().ToString(); var customHeader = new ExtendedPropertyDefinition( DefaultExtendedPropertySet.InternetHeaders, "X-Trace-Id", MapiPropertyType.String); email.SetExtendedProperty(customHeader, traceId); email.Send(); // 在B邮箱搜索时用这个traceId过滤 var traceFilter = new SearchFilter.IsEqualTo(customHeader, traceId); var targetItems = serviceB.FindItems(WellKnownFolderName.Inbox, traceFilter, new ItemView(1));组合基础字段缩小范围
如果以上方法都不适用,还可以通过原始邮件的主题、发送时间、原始发件人这些字段组合搜索。比如在B邮箱里找发送时间和原始邮件相差10分钟以内,主题匹配,发件人为原始发件人的邮件,再进一步验证邮件内容或其他头部信息。
内容的提问来源于stack exchange,提问作者CodeObsession
相关产品推荐
相关产品推荐

