EWS托管Api中的电子邮件对话/电子邮件线程支持(针对Exchange 2010左右)

tur*_*ula 8 asp.net exchange-server exchangewebservices ews-managed-api

EWS托管API具有的功能,用于检索和管理屈指可数的电子邮件对话(又名 电子邮件线程).不幸的是,其中很大一部分只适用于版本的Exchange(2013等)

Outlook确实实现了针对旧版 Exchange的电子邮件线程.也许它通过自己管理线程来实现这一点(Outlook是桌面应用程序,电子邮件在本地计算机上复制,因此可以通过Conversation Topic等轻松分组).

现在,如何在Web应用程序中支持电子邮件线程?通常在Exchange客户端中支持此功能的操作是什么?通过支持我的意思是:

  • 检索前10个会话快照,然后检索接下来的10个会话快照 - 即支持分页(按需检索页面) - 此数据将用于构建主视图
  • 检索对话中的所有电子邮件 - 也就是说,按需检索对话的孩子 - 这些数据将用于构建对话的详细视图.

EWS Managed Api等问题:

  • EWS Managed API中没有Conversation.Bind(conversationId)
  • ExchangeService.FindItems(ConversationTopic的过滤器=="某个主题")绝不可靠(因为可能有不同的会话具有相同的主题)
  • ExchangeService.FindItems(过滤器为ConversationId =="QWERYUIO") - 我无法弄清楚如何使用这个:)是否有可能通过ConversationId搜索电子邮件?
  • ExchangeService.GetConversationItems()等函数仅适用于以Exchange Online为目标的客户端以及以Exchange Server 2013开头的Exchange版本.

我现在使用的(作为解决方法):

  1. 使用ExchangeService.FindConversation()检索(按需)一页对话
  2. 对于检索到的页面中的每个对话,请阅读Conversation.GlobalIds属性
  3. 构建一个包含所有GlobalIds值的聚合(数组)- 通过连接所有对话的Conversation.GlobalIds
  4. 进行Exchange调用以将ID绑定到电子邮件(ExchangeService.BindToItems)
  5. 执行由组的邮件(在概念上,它是一个分组操作,但是执行不是一个简单的组通过调用操作-邮件无法通过分组的conversationId,作为财产对Exchange 2010中工作时,无法使用,虽然文档没有指定这个)
  6. 使用数据一步构建UI (主视图的对话列表,每个对话的详细视图的电子邮件组)等.

上述实现的一些问题

  • 我在调用ExchangeService.BindToItems操作时从服务器检索大量数据- 性能不是很好,但也不是很糟糕.当然,仅当用户想要访问特定对话的详细视图时才检索电子邮件会更好.可能的hack:将GlobalIds数组保存在隐藏字段中的某个位置,然后使用它来获取电子邮件以构建详细信息视图.我知道GET请求的大小有限,但是......

在电子邮件对话/电子邮件线程中,没有人知道哪些支持:

  • 这里FindConversation(ViewBase,FolderId)适用于以Exchange Online为目标的客户端和从Exchange Server 2013开始的Exchange版本.另一方面,这里写的是ExchangeService.FindConversation()函数可以用于从Exchange 2010开始的Exchange版本,包括Exchange Online.
  • 也很有趣:适用于:EWS托管API | Exchange Server 2010 Service Pack 1(SP1),但请确保您拥有主要版本为15或更高版本的Exchange 2013或Exchange Online服务帐户.:)
  • 在这里,它表示Item.ConversationId属性在Exchange版本的Exchange 2010中可用,包括Exchange Online.但它不是:)

注意:我不太确定Item.ConversationId的支持,因为我手边没有代码,现在无法执行测试.因此,如果在使用针对Exchange 2010的EWS托管API时该属性可用,请原谅我.

总而言之,您是否有任何想法在Web应用程序中使用针对Exchange 2010服务器的EWS托管API实现电子邮件对话/电子邮件线程功能?

非常感谢你耐心阅读这么长的帖子:)

一些参考:

http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.exchangeservice_methods%28v=exchg.80%29.aspx http://msdn.microsoft.com/en-us/library /microsoft.exchange.webservices.data.conversation_members%28v=exchg.80%29.aspx http://msdn.microsoft.com/en-us/library/office/gg274407%28v=exchg.80%29.aspx http ://msdn.microsoft.com/en-us/library/office/jj220497%28v=exchg.80%29.aspx

使用EWS和Exchange 2007通过对话实现Outlook 2010的 Exchange Web服务托管API - 按扩展属性查找项目

Mim*_*ntz 6

我已经解决了您在评论中提到的一些文档问题,因此我将尝试在此处回答您的实际编码问题.

要获取主视图,ExchangeService.FindConversation是正确的方法.它通过将结果限制为view参数指定的会话数来支持分页.您可以根据需要调用它来获取较旧和较旧的结果.

要获取详细视图,因为Exfor1010上没有ExchangeService.GetConversationItems,您可以将ExchangeService.FindItems与IsEqualTo SearchFilter一起使用,以搜索具有匹配ConversationId的项目(请参阅下面的代码).这里有关于搜索过滤器的更多信息:如何:在Exchange中使用带有EWS的搜索过滤器.

在下面的方法中,我通过指定属性集来限制FindItems调用的属性,而不是返回所有属性.如果要返回所有属性,只需删除设置PropertySet的行.

static void forumFindConversationItem(ExchangeService service)
    {
        ItemView view = new ItemView(10);

        //Remove the following line if you want to get all the properties for each message. This will limit the properties returned in your results (and save time).
        view.PropertySet = new PropertySet(EmailMessageSchema.Subject, EmailMessageSchema.DateTimeReceived);

        SearchFilter.IsEqualTo conversationFilter =
            new SearchFilter.IsEqualTo(EmailMessageSchema.ConversationId, "AAQkADIwM2ZlM2ZlLWMwYjctNDg2Ny04MDU0LTVkMTFmM2IxY2ZjZQAQANEDR7V/30dphLiNOLSTuxE=");

        FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Inbox, conversationFilter, view);
    }
Run Code Online (Sandbox Code Playgroud)

一旦你有了每个ItemID(由上面的代码返回),你就可以使用Bind方法获得每个项目的所有属性.

希望有所帮助.当MSDN上的方法的版本控制问题得到更新时,我会跟进.

  • 通过_ConversationId_进行过滤对Exchange2013有效,但不对Exchange2010_SP2进行过滤,因为它会传递此错误:_"该属性不能与此类限制一起使用."_.看来该服务不喜欢在_EmailMessageSchema.ConversationId_属性上看到过滤器:( (2认同)