1

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

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

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

4

2 回答 2

3

同步项目的内置方法是通过名为SyncFolderItems. 基本上交换所有东西,包括联系人是一个文件夹,所以你只需在同步请求CONTACTS中传递DistinguishedFolderId

同步通过以最多 512 个元素的批次卸载给定帐户的所有项目并在每批之后为您SyncState提供 Exchange 的参考点,以了解您停止的位置。因此,它使您能够进行增量同步。

现在,这当然是一种方式,意思是 Exchange -> Your DB。另一种方式是您应该执行原子更新/请求 - 当您从数据库更改/添加/删除项目时,您应该向 Exchange 服务器发出足够的请求以保持数据同步,否则它将在您的下一个SyncFolderItems.

您可以在SyncFolderItems@MSDN上阅读更多内容

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

希望这可以帮助 :)

于 2012-04-27T06:55:57.607 回答
2

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

我也刚刚将此添加到官方 php-ews wiki: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;
    }
}
于 2014-11-04T13:21:29.713 回答