PHP - 使用Exchange同步MySQL联系人

时间:2012-04-25 13:55:26

标签: php mysql exchange-server sync

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

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

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

2 个答案:

答案 0 :(得分:3)

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

同步的工作方式是批量处理最多512个元素的给定帐户的所有项目,并在每个批次之后,它为您提供SyncState作为Exchange的参考点,以了解您中断的位置。因此,它使您能够进行增量同步。

现在,这是一种当然的方式,意味着交流 - >你的DB。你应该预先形成原子更新/请求的另一种方式 - 当您从数据库更改/添加/删除项目时,您应该向Exchange服务器发出足够的请求以保持数据同步,然后它将被覆盖在您的下一个{{ 1}}。

您可以在SyncFolderItems @ MSDN

上阅读更多内容

如果您想查看SyncFolderItems的示例,可以查看@ python version of EWSWrapper,最近已添加。虽然它是python,但你仍然可以获得如何构造请求/句柄响应的基本思想。

希望这会有所帮助:)

答案 1 :(得分: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;
    }
}