编程语言
首页 > 编程语言> > php – 如何通过对话对各个电子邮件进行分组,以便我确定(100%)一封电子邮件与另一封电子邮件在同一个对话中?

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中不存在.ConversationTopicConversationIndex在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