Exchange Web服务获取消息消息ID

时间:2014-06-23 16:38:03

标签: java exchangewebservices ewsjavaapi

我正在使用Java EWS library尝试同步来自Exchange邮箱的邮件。我能够获取自上次同步日期以来创建的所有新消息的列表,但是,我真的想在从交换中加载之前找到消息的Message-ID属性。

背景:我正在尝试将EWS同步集成到现有的邮件存储系统中。消息ID标识仅出于性能原因,因为我们的系统已经在EWS之外处理了数百万条消息。必须再次下载它们会导致重大的性能开销。

//Sample code to fetch the message from sync

ChangeCollection<ItemChange> icc = service.syncFolderItems( folder.getId()
                    , PropertySet.FirstClassProperties // propertySet
                    , null // ignoredItemIds
                    , 25 // maxChangesReturned
                    , SyncFolderItemsScope.NormalItems
                    , currSyncState );

for ( ItemChange ic : icc )
{
    if (ic.getChangeType() == ChangeType.Create)
    {
        Item item = ic.getItem();
        //how to get the Message-ID
    }

现在,我看到检索Message-ID的最佳方式是在调用ic.getItem().getInternetMessageHeaders()后调用ic.load()。但这需要从交换中加载整个消息,我会避免这一步骤。

编辑:获取消息ID的另一种方法是

EmailMessage em = EmailMessage.bind( service, item.getId() );
em.getInternetMessageId()

然而,仍然会加载整个邮件。

另一个解决方案是开始通过ItemId关联消息,但即便这样也不完美:http://daniellang.net/exchange-web-services-itemid-is-not-permanent/

有关留言ID的更多信息:http://en.wikipedia.org/wiki/Message-ID

1 个答案:

答案 0 :(得分:3)

我相信解决方案是:

EmailMessage em = EmailMessage.bind( service, item.getId(),
                   new PropertySet( EmailMessageSchema.InternetMessageId) );

说明:

我们必须将项目绑定到电子邮件消息,但不是抓取所有信息,而是通过PropertySet参数询问ID和我们想要的任何其他属性。

受到这个答案的启发:https://stackoverflow.com/a/22482779/138228