【问题标题】:PHP - Syncing MySQL Contacts with ExchangePHP - 将 MySQL 联系人与 Exchange 同步
【发布时间】:2014-11-05 00:12:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: php mysql exchange-server sync


    【解决方案1】:

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

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

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

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

    如果您想查看SyncFolderItems 的示例,可以查看@python version of EWSWrapper,它是最近添加的。虽然是python,但还是可以大致了解如何构造请求/处理响应。

    希望这会有所帮助:)

    【讨论】:

      【解决方案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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        相关资源
        最近更新 更多