php – 如何通过对话对各个电子邮件进行分组,以便我确定(100%)一封电子邮件与另一封电子邮件在同一个对话中?
作者:互联网
题
在使用Exchange WebServices API时,如何通过对话对各个电子邮件进行分组,以便我确定(100%)一封电子邮件与另一封电子邮件在同一个对话中?
个人意思是:我应该能够一次下载1封电子邮件,因为当发送延迟回复时(比如上个月回复电子邮件),我不想批量下载整个会话再次,但只有一封电子邮件能够将其存储在我自己的数据库中.
上下文
我正在开发一个项目,我需要将所有新鲜的电子邮件放在MySQL数据库中,以便我们可以从CRM应用程序中添加额外的元数据.现在我正在使用基于XML的Exchange WebServices API进行一些原型设计,以便我知道哪些数据可用以及它们是什么样的.我在PHP中这样做(也是我们的CRM内置的语言).
问题
运行简单的XML请求(见下文)时,我会收到来自inbox / sentitems文件夹的一些电子邮件.由于我知道我与同事进行了对话以测试ConversationIndex,因此我发现ConversationIndex似乎并不像我预期的那样是一个索引.我希望它在所有电子邮件中都是平等的,这样我就可以轻松地将一个对话组合在一起.
但这似乎不是真的.因为当我将我的收件箱和snetitems(一个对话)的ConversationIndexs放在一起时,我得到以下结果:( – > sentitem,< - inbox)
> – > Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQ ==(first sentitem)
>< - Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQAAAT1A(回复1)
> – > Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQAAAT1AAAAHYQA =(回复2)
>< - Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQAAAT1AAAAHYQAAAAScMA ==(回复3)
> – > Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQAAAT1AAAAHYQAAAAScMAAACBsQ(回复4)
>< - Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQAAAT1AAAAHYQAAADX4EA ==(回复5)
>< - Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQAAP7ZQ(回复1)
其他会话示例ConversationIndex:Ac9IB53hRlE85QAKR9qCJ8pbv8gikwAAtByQ
正如您所看到的,每个电子邮件的ConversationIndex更改除了前30个字符.通过查阅this question的答案我发现的另一件事是我应该使用BitConverter并修改ConverationIndex,但那是C#.我也找不到这方面的PHP解决方案.
另外,我在EWS文档中找不到关于此主题的任何信息(例如:http://msdn.microsoft.com/en-us/library/ms528174(v=exchg.10).aspx).
可能的选择
我在Exchange服务器的XML响应中看到了一个References键,但使用这些InternetMessageId确定电子邮件所在的对话将成为一个真正的地狱.
我注意到的另一件事是ConversationId(http://msdn.microsoft.com/en-us/library/ff387041%28v=office.12%29.aspx),但这似乎不是我想要的.
XML请求,仅供参考
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
Traversal="Shallow">
<ItemShape>
<t:BaseShape>AllProperties</t:BaseShape>
</ItemShape>
<IndexedPageItemView MaxEntriesReturned="5" Offset="0" BasePoint="Beginning" />
<ParentFolderIds>
<t:DistinguishedFolderId Id="inbox OR sentitems"/>
</ParentFolderIds>
</FindItem>
</soap:Body>
</soap:Envelope>
更新1
看起来我必须使用ConversationId而不是索引.虽然我目前正在使用Exchange 2007,但我们很快就会升级到2013年.有人可以确认我必须使用ConversationId吗?
解决方法:
Jelmer-
我最近在MSDN上写了How to: Work with conversations by using EWS in Exchange文章.在Exchange 2013中引入的GetConversationItems EWS操作是您要用于检索特定对话中的所有内容的操作. GetConversationItems使用ConversationId元素,这在Exchange 2007中不存在.ConversationTopic和ConversationIndex在Exchange 2007中存在 – 我假设你可以使用另一个操作来查找具有特定ConversationTopic的所有项目,但我没有必要这样做那.如果您需要有关该方法的帮助,请告诉我.
ConversationThread是您在上面标识的值(Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQ),在第一条消息上,每当项目被响应,转发等时,ConversationIndex就会递增.
从article:“Exchange应用相同的ConversationTopic值来回复第一条消息,然后更新ConversationIndex值以表示消息相对于原始消息的位置.如果电子邮件主题的主题发生更改,Exchange将应用新的ConversationTopic值,新的ConversationIndex值为新会话.“
我注意到您在帖子中称为EWS文档的内容实际上是CDO文档. Exchange 2013的EWS参考内容位于:http://msdn.microsoft.com/en-us/library/bb204119(v=exchg.150).aspx.Exchange 2007的EWS参考内容(如果要进行比较)位于:http://msdn.microsoft.com/en-us/library/bb204119(v=exchg.80).aspx.
希望这有帮助,如果我确实回答了你的问题,请将帖子标记为已回答.
谢谢,
咪咪
在3/27更新,以回答有关ConversationId的其他问题:
我只是玩这个以确定,如果主题被更改,ConversationId确实会改变,但只要消息被转发并回复,它就会保持不变.我原来的ConversationId是:
<ConversationId Id="AAQkADI2MDY4MjQzLWQ1YzQtNGZkNi1iZmE4LTRjZmZmNGEyZjQ0YwAQAJJCqNI7ZfhJmIh7j2kgJvk=" />
<ConversationTopic>Original</ConversationTopic>
但在两次更改主题后,它看起来像这样:
<ConversationId Id="AAQkADI2MDY4MjQzLWQ1YzQtNGZkNi1iZmE4LTRjZmZmNGEyZjQ0YwAQAEjf5yU/W9VMo6HxuanvhYE=" />
<ConversationTopic>2nd subject</ConversationTopic>
所以前X个字符是相同的,但后来有分歧.
标签:php,exchangewebservices 来源: https://codeday.me/bug/20190728/1563102.html