如何使用EWS Java API过滤别名邮箱收到的邮件?
筛选发送到别名邮箱的EWS邮件
我之前在处理Exchange别名邮箱的邮件筛选时,也踩过类似的坑——关键是要找对存储目标别名的属性字段。
首先,你需要重点关注**ReceivedByEmailAddress**这个属性:它专门记录邮件实际被发送到的邮箱地址(也就是你的别名b@b.com),而你的主邮箱a@b.com会对应ReceivedRepresentingEmailAddress属性。相比检查收件人列表,这个属性更准确,尤其是当邮件经过转发或有其他规则处理时。
你的原代码没生效,大概率是两个原因:一是没有添加过滤条件,二是默认的查询不会返回ReceivedByEmailAddress这类非基础属性,必须显式指定要加载的属性集。
下面是修正后的完整代码示例:
// 定义需要加载的属性集,必须包含ReceivedBy相关属性 PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties); propertySet.add(ItemSchema.ReceivedBy); propertySet.add(ItemSchema.ReceivedRepresenting); // 创建过滤条件:筛选发送到别名b@b.com的邮件 SearchFilter.IsEqualTo targetAliasFilter = new SearchFilter.IsEqualTo( ItemSchema.ReceivedByEmailAddress, "b@b.com" ); // 执行带过滤条件的查询 FindItemsResults<Item> fiResults = exchangeService.findItems( WellKnownFolderName.Inbox, targetAliasFilter, new ItemView(100) ); // 加载邮件的完整属性(如果需要操作邮件内容、附件等) exchangeService.loadPropertiesForItems(fiResults, propertySet); // 遍历筛选后的结果 for (Item item : fiResults.getItems()) { if (item instanceof EmailMessage) { EmailMessage email = (EmailMessage) item; System.out.println("主题:" + email.getSubject()); System.out.println("实际收件邮箱:" + email.getReceivedByEmailAddress()); } }
如果因为Exchange版本差异导致ReceivedByEmailAddress不生效,你可以退而求其次,解析邮件的X-Original-To消息头(这个头会记录最初的收件邮箱地址),代码示例如下:
// 仅加载邮件ID和Internet消息头属性 PropertySet headerPropertySet = new PropertySet(BasePropertySet.IdOnly); headerPropertySet.add(ItemSchema.InternetMessageHeaders); FindItemsResults<Item> fiResults = exchangeService.findItems( WellKnownFolderName.Inbox, new ItemView(100) ); // 加载指定属性 exchangeService.loadPropertiesForItems(fiResults, headerPropertySet); // 遍历并筛选目标邮件 for (Item item : fiResults.getItems()) { if (item instanceof EmailMessage) { EmailMessage email = (EmailMessage) item; for (InternetMessageHeader header : email.getInternetMessageHeaders()) { if (header.getName().equalsIgnoreCase("X-Original-To")) { String originalRecipient = header.getValue(); if (originalRecipient.equals("b@b.com")) { System.out.println("找到目标邮件:" + email.getSubject()); } } } } }
优先推荐第一种方法,因为ReceivedByEmailAddress是EWS提供的标准属性,比解析自定义消息头更稳定可靠。
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

