Jel*_*mer 4 php exchangewebservices
题
在使用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个字符.通过查阅这个问题的答案我发现的另一件事是我应该使用BitConverter并修改ConverationIndex,但那是C#.我也找不到这方面的PHP解决方案.
另外,我在EWS文档中找不到关于此主题的任何信息(例如:http://msdn.microsoft.com/en-us/library/ms528174(v = exchg.10).aspx).
可能的选择
我References在Exchange服务器的XML响应中看到了一个键,但使用这些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>
Run Code Online (Sandbox Code Playgroud)
更新1
看起来我必须使用ConversationId而不是索引.虽然我目前正在使用Exchange 2007,但我们很快就会升级到2013年.有人可以确认我必须使用ConversationId吗?
Jelmer-
我最近在MSDN上的Exchange文章中使用EWS编写了如何:使用对话来处理对话.在Exchange 2013中引入的GetConversationItems EWS操作是您要用于检索特定对话中的所有内容的操作.GetConversationItems使用 ConversationId元素,它在Exchange 2007中不存在.ConversationTopic和ConversationIndex在Exchange 2007中出现 - 我想你可以使用另一个操作来查找具有特定ConversationTopic的所有项目,但我没有必要这样做那.如果您需要有关此方法的帮助,请告诉我.
ConversationThread是您在上面标识的值(Ac9IKUBx8yX3vSXYQSWcb8ggCfC7FQ),在第一条消息上,每当项目被响应,转发等时,ConversationIndex就会递增.
从文章:"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>
Run Code Online (Sandbox Code Playgroud)
但在两次更改主题后,它看起来像这样:
<ConversationId Id="AAQkADI2MDY4MjQzLWQ1YzQtNGZkNi1iZmE4LTRjZmZmNGEyZjQ0YwAQAEjf5yU/W9VMo6HxuanvhYE=" />
<ConversationTopic>2nd subject</ConversationTopic>
Run Code Online (Sandbox Code Playgroud)
所以前X个字符是相同的,但后来有分歧.
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |