PHP - 将 MySQL 联系人与 Exchange 同步


PHP - Syncing MySQL Contacts with Exchange

作为PHP web应用程序的一部分,我有MySQL联系人表。它集成在整个应用程序中,允许您添加联系人、编辑联系人或将联系人添加为与另一个表的关系。但是,目前它是自包含的。该公司希望它与 Exchange 同步,以便添加到 Exchange 的联系人将显示在 Web 应用程序上,而添加到 Web 应用程序上的联系人将通过 Exchange 显示。

所以我有两个问题:1)与Exchange通信2)与Exchange同步。

就基本通信而言,看起来这个库将能够 https://github.com/jamesiarmes/php-ews 管理它。但是,我对如何管理同步感到非常迷茫,并且不知道从哪里开始。

同步项目的内置方法是通过名为 SyncFolderItems 的函数。基本上,交换所有内容(包括联系人)都是一个文件夹,因此您只需在同步请求中CONTACTS DistinguishedFolderId传递即可。

同步的工作原理是批量加载给定帐户的所有项目,最多 512 个元素,每批后,它为您提供SyncState作为 Exchange 的参考点,以了解您离开的位置。因此,它使您能够进行增量同步。

现在,这当然是一种方式,意味着交换 ->你的数据库。另一种方式是您应该执行原子更新/请求 - 当您从数据库中更改/添加/删除项目时,您应该向 Exchange 服务器发出足够的请求以保持数据同步,因为它将在您的下一次SyncFolderItems被覆盖。

您可以在SyncFolderItems@ MSDN上阅读更多信息

如果你想看SyncFolderItems的例子,你可以看看@python版本的EWSWrapper,它是最近添加的。虽然它是python,但您仍然可以了解如何构造请求/句柄响应的基本概念。

希望这对:)有所帮助

我知道

这个话题已经很老了。但是,为了将来参考,请在下面找到解决方案。它正在使用上述库 php-ews。

我也刚刚将其添加到官方php-ews维基中:https://github.com/jamesiarmes/php-ews/wiki/Calendar:-Synchronization

// Define EWS
$ews = new ExchangeWebServices($host, $username, $password, $version);
// fill with string from last sync
$sync_state = null;
$request = new EWSType_SyncFolderItemsType;
$request->SyncState = $sync_state;
$request->MaxChangesReturned = 512;
$request->ItemShape = new EWSType_ItemResponseShapeType;
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;
$request->SyncFolderId = new EWSType_NonEmptyArrayOfBaseFolderIdsType;
$request->SyncFolderId->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType;
$request->SyncFolderId->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;
$response = $ews->SyncFolderItems($request);
$sync_state = $response->ResponseMessages->SyncFolderItemsResponseMessage->SyncState;
$changes = $response->ResponseMessages->SyncFolderItemsResponseMessage->Changes;
// created events
if(property_exists($changes, 'Create')) {
    foreach($changes->Create as $event) {
        $id = $event->CalendarItem->ItemId->Id;
        $change_key = $event->CalendarItem->ItemId->ChangeKey;
        $start = $event->CalendarItem->Start;
        $end = $event->CalendarItem->End;
        $subject = $event->CalendarItem->Subject;
    }
}
// updated events
if(property_exists($changes, 'Update')) {
    foreach($changes->Update as $event) {
        $id = $event->CalendarItem->ItemId->Id;
        $change_key = $event->CalendarItem->ItemId->ChangeKey;
        $start = $event->CalendarItem->Start;
        $end = $event->CalendarItem->End;
        $subject = $event->CalendarItem->Subject;
    }
}
// deleted events
if(property_exists($changes, 'Delete')) {
    foreach($changes->Delete as $event) {
        $id = $event->CalendarItem->ItemId->Id;
        $change_key = $event->CalendarItem->ItemId->ChangeKey;
        $start = $event->CalendarItem->Start;
        $end = $event->CalendarItem->End;
        $subject = $event->CalendarItem->Subject;
    }
}