asp.net - EWS Managed Api 中的电子邮件对话/电子邮件线程支持(针对 Exchange 2010 左右)

标签 asp.net exchange-server exchangewebservices ews-managed-api

EWS 托管 API 有一些用于检索和管理的功能 电子邮件对话 (又名 电子邮件线程 )。不幸的是,其中很大一部分仅适用于新版本的 Exchange(2013 等)

Outlook 确实针对旧版本的 Exchange 实现电子邮件线程。也许它是通过自己管理线程来实现的(Outlook 是一个桌面应用程序,电子邮件被复制到本地机器上,因此它们可以很容易地按对话主题等进行分组)。

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

  • 检索前 10 个对话快照,然后检索接下来的 10 个对话快照 - 即 支持分页 (按需检索页面)- 此数据将用于构建 主 View
  • 检索对话中的所有电子邮件 - 即 按需检索对话的子级 ) - 此数据将用于构建 详细 View 的一次谈话。

  • EWS 托管 Api 等问题:
  • EWS 托管 API 中没有 Conversation.Bind(conversationId)
  • ExchangeService.FindItems(ConversationTopic 的过滤器 == "some topic") 绝不可靠(因为可能有不同的 session 具有相同的主题)
  • ExchangeService.FindItems(ConversationId 过滤器 == "QWERYUIO") - 我不知道如何使用它 :) 是否可以通过 搜索电子邮件?对话 ID ?
  • 像 ExchangeService.GetConversationItems() 这样的函数仅“适用于面向 Exchange Online 和从 Exchange Server 2013 开始的 Exchange 版本的客户端”。

  • 我现在使用的是什么(作为一种解决方法) :
  • 使用 ExchangeService.FindConversation() 检索(按需)一页对话
  • 对于检索到的页面中的每个对话,阅读 Conversation.GlobalIds 属性
  • 构建一个包含所有 GlobalId 值的聚合(一个数组) - 通过连接所有对话的 Conversation.GlobalIds
  • 进行 Exchange 调用以将 ID 绑定(bind)到电子邮件 (ExchangeService.BindToItems)
  • 执行电子邮件的分组操作(从概念上讲,这是一个分组操作,但实现不是一个简单的分组调用 - 电子邮件不能按 ConversationId 分组,因为该属性在针对 Exchange 2010 工作时不可用,尽管文档没有指定这一点)
  • 使用数据一步构建 UI(主 View 的对话列表,每个对话的详细 View 的电子邮件组)等。

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

  • 在电子邮件对话/电子邮件线程中,没有人知道哪个支持什么:
  • Here它说 FindConversation(ViewBase, FolderId) 适用于面向 Exchange Online 和从 Exchange Server 2013 开始的 Exchange 版本的客户端。另一方面,here据说 ExchangeService.FindConversation() 函数可用于从 Exchange 2010 开始的 Exchange 版本,包括 Exchange Online。
  • This也很有趣:适用于:EWS 托管 API | Exchange Server 2010 Service Pack 1 (SP1),但请确保您拥有主要版本为 15 或更高版本的 Exchange 2013 或 Exchange Online 服务帐户。 :)
  • Here它说 Item.ConversationId 属性在从 Exchange 2010 开始的 Exchange 版本中可用,包括 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

    Implementing Outlook 2010's group by conversation using EWS and Exchange 2007
    Exchange Webservice Managed API - Find items by extended properties

    最佳答案

    我已经解决了您在评论中遇到的一些文档问题,因此我将尝试在这里回答您真正的编码问题。

    要获得主 View ,ExchangeService.FindConversation 是正确的使用方法。它通过将结果限制为由 view 参数指定的 session 数来支持分页。您可以按需调用它以获得越来越旧的结果。

    要获得详细 View ,因为 ExchangeService.GetConversationItems 在 Ex2010 上不可用,您可以将 ExchangeService.FindItems 与 IsEqualTo SearchFilter 一起使用,以搜索具有匹配 ConversationId 的项目(请参阅下面的代码)。这里有关于搜索过滤器的更多信息:How to: Use search filters with EWS in Exchange .

    在下面的方法中,我通过指定一个属性集来限制 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);
        }
    

    获得每个 ItemID(由上面的代码返回)后,您可以使用 Bind 方法获取每个项目的所有属性。

    希望有帮助。当 MSDN 上方法的版本问题更新后,我会跟进。

    关于asp.net - EWS Managed Api 中的电子邮件对话/电子邮件线程支持(针对 Exchange 2010 左右),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317493/

    相关文章:

    c# - Global.asax 和 MasterPage 之间会发生什么?

    javascript - 如何在asp.net和vb.net中单击删除按钮后向后重定向两步

    c# - 关于多用户全局变量的思考

    c# - 是否可以将强类型数组绑定(bind)为 ASP.NET Core 中的配置模型?

    c# - Exchange Web 服务 : why is ItemId not constant?

    c# - 有没有办法使用 ews c# 确定电子邮件是否是回复/响应?

    json - 将 Outlook REST API 项目 ID 转换为 MAPI EntryID

    Java 邮件客户端到 MS Exchange 服务器

    exchange-server - Exchange 服务器插件/插件开发

    c# - 如何使用 EWS 获取电子邮件的收件人