You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:23:11