当前位置: 首页 > 知识库问答 >
问题:

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

经俊茂
2023-03-14

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

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

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

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

EWS管理的Api等问题。:

    < li >没有对话。EWS托管API中的Bind(conversationId) < li>ExchangeService。find items(ConversationTopic = = " some topic ")一点也不可靠(因为可能有不同的会话具有相同的主题) < li>ExchangeService。find items(ConversationId = = " QWERYUIO的过滤器)-我不知道如何使用这个:)可以通过conversation id搜索电子邮件吗? < like ExchangeService等功能。GetConversationItems()仅“适用于以Exchange Online和从Exchange Server 2013开始的Exchange版本为目标的客户端”

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

  1. 使用Exchange eService. FindConversation()检索(按需)对话页面
  2. 对于检索到的页面中的每个对话,阅读Conversation. GlobalIds属性
  3. 构建一个包含来自所有GlobalIds的值的聚合(一个数组)-通过连接所有对话的Conversation. GlobalIds
  4. 进行Exchange调用以将id绑定到电子邮件(Exchange eService. BindToItems)
  5. 对电子邮件执行分组操作(从概念上讲,这是一个分组操作,但实现不是一个简单的分组调用-电子邮件不能按ConversationId分组,因为该属性在针对Exchange 2010工作时不可用,尽管留档没有指定这一点)
  6. 使用数据一步构建UI(主视图的对话列表,每个对话的详细视图的电子邮件组)等。

上述实现的一些问题

  • 在调用Exchange eService. BindToItems操作时,我正在从服务器检索大量数据——性能并不出色,但也不是很差。当然,只有当用户想要访问特定对话的详细视图时才检索电子邮件会更好。一个可能的黑客:将GlobalIds数组保存在隐藏字段的某处,然后使用它来获取电子邮件以构建详细视图。我知道GET请求的大小有限,但是…

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

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

注意:我不是很确定该项目的支持度。ConversationId,因为我手头没有代码,无法立即执行测试。因此,如果在对Exchange 2010使用EWS托管API时,该属性仍然可用,请原谅。

总而言之,您对在Exchange 2010服务器上使用EWS托管API在web应用程序中实现电子邮件会话/电子邮件线程功能有什么想法吗?

非常感谢你有耐心看完这么长的帖子:)

一些参考文献:

http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.exchangeservice_methods. aspx http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.conversation_members.aspx http://msdn.microsoft.com/en-us/library/office/gg274407.aspx http://msdn.microsoft.com/en-us/library/office/jj220497

使用EWS和Exchange 2007 Exchange Webservice管理的API实现Outlook 2010的group by conversation通过扩展属性查找项目

共有2个答案

丰赞
2023-03-14

更一般地说,ConversationID似乎存在问题,因为它被广泛理解并实际用于Exchange本身。这可能会影响你(或任何人)的发展。

我一直在制作一个电子邮件票务程序,并使用ConversationID将电子邮件集中在一个线程中,以便查看。

但是现在看来,有些电子邮件不在同一个线程上——是的,它们共享相同的主题和发件人地址,并且在同一日期/时间发送——但是它们不会出现在彼此的引用中(例如,一个电子邮件正文对一个旧的电子邮件正文的回应是一个“电子邮件线程”有多少个解释)——然而这些不同的电子邮件具有相同的确切ConversationID,即使一个正文与另一个没有任何关系。

事实上,即使日期/时间不接近,例如,来自同一个人的“今天的想法”电子邮件,这些电子邮件有时也会与相同的ConversationID分组。在这种情况下,这听起来可能很有用,但在工资单人员发送“RE:401k”的商业案例中并不那么有用。

需要说明的是,这不是一个区分大小写的强者,是我在使用Item时的一个疏忽。ExchangeID before(如果考虑大小写,它是唯一的)。即使算上大小写,完全不同的电子邮件线程也有完全相同的ConversationID。

这对我来说意味着不能依赖ConversationID作为GROUP BY子句,必须使用一些额外的,自定义创建的代码

汪驰
2023-03-14

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

要获取主视图,ExchangeService.FindConversation是正确的方法。它通过将结果限制在view参数指定的对话次数来支持分页。你可以按需调用它,以获得越来越老的结果。

以获得您的详细视图,因为ExchangeService。GetConversationItems在Ex2010上不可用,您可以使用ExchangeService。使用IsEqualTo SearchFilter查找具有匹配ConversationId的项目(参见下面的代码)。这里有更多关于搜索筛选器的信息:如何:在Exchange中对EWS使用搜索筛选器。

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

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上方法的版本控制问题更新后,我会跟进。

 类似资料:
  • 问题内容: 我正在使用sendgrid发送电子邮件,并且使用以下代码可以正常工作,但没有附件。 但是我需要发送附件,因此我搜索了github源和Web文档API,由于某种原因,没有javadocs,但是有一个示例GitHub sendgrid, 所以我一直在尝试直到它起作用为止,我缩小了一些异常和响应代码,起初我是被禁止的未经授权,最好是响应202,表示有效且已排队(在此处检查),这是我的代码发送

  • 我们的应用程序自动发送电子邮件,我需要这些电子邮件分组在线程,所以用户有他们的组织在他们的邮箱。这些邮件也可以有不同的主题。例如: 已创建问题93 问题93描述已更改 问题93受理人已更改 null 在不同的科目中,这实际上是可能的吗?我需要使用不同的策略吗? 谢谢

  • 查看以下,详细了解如何处理与 iPhone 手机配对的 M600 上的电子邮件。 阅读您的 M600 上的电子邮件 如果您在手机上使用电子邮件通知,那么在您收到新邮件时会在您的 M600 看到通知。 阅读电子邮件 轻触通知。 利用您的 M600 回复电子邮件 您可以利用您的手腕表回复邮件。 回复电子邮件 轻触通知查看所有邮件 从屏幕底部向上滑动,查看您可以执行的操作。 轻触 Reply(回复),并

  • Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务。 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。 我们来看看传统邮件是如何运作的。假设你现在在北京,要给一个香港的朋友发一封信,怎么做呢? 首先你得写好信,装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去。 信件会从就近的小

  • Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务。 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。 我们来看看传统邮件是如何运作的。假设你现在在北京,要给一个香港的朋友发一封信,怎么做呢? 首先你得写好信,装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去。 信件会从就近的小

  • 我想出了一个解决办法,就是导入所有用户的电子邮件文件夹。这个解决方案是工作的,它只是繁琐的维护,因为我们几乎每周都有新的/删除的用户。

  • 我正在使用spring Boot从java发送HTML电子邮件。电子邮件包括签名与我们公司的形象标志。它工作得很好。在Gmail上。但在MacOS应用程序电子邮件中,徽标是作为附件发送的,而不是内联的。 代码的非相关部分替换为...

  • 要使用Erlang发送电子邮件,您需要使用github提供的相同包。 github链接是 - https://github.com/Vagabond/gen_smtp 此链接包含一个smtp utility ,可用于从Erlang应用程序发送电子邮件。 按照步骤,可以从Erlang发送电子邮件 Step 1 - 从github site下载erl files 。 应将这些文件下载到hellowor