HOWTO соединить биллинг (в моем случае - личный журнал звонков) и контакты Outlook.
http://www.powerpbx.ru/blog/?p=134
| Цитата: |
| Существует проект php-ews. Он практически не документирован, но разобраться не составило особого труда, помогла страничка http://www.howtoforge.com/talking-soap-with-exchange своими примерами. Итак, скачиваем библиотеку: svn checkout http://php-ews.googlecode.com/svn/trunk/ php-ews Кусок нашего скрипта: require 'php-ews/ExchangeWebServices.php'; require 'php-ews/NTLMSoapClient.php'; require 'php-ews/NTLMSoapClient/Exchange.php'; $exchServer = 'exchange.lan'; $ews = new ExchangeWebServices($exchServer, $PHP_AUTH_USER, $PHP_AUTH_PW); $FindFolder->Traversal = "Shallow"; $FindFolder->FolderShape->BaseShape = "AllProperties"; $FindFolder->ParentFolderIds->DistinguishedFolderId->Id = "msgfolderroot"; $result = $ews->FindFolder($FindFolder); $contactfolders = $result->ResponseMessages->FindFolderResponseMessage->RootFolder->Folders->ContactsFolder; if (is_object($contactfolders->FolderId)) { $folders[0] = $contactfolders; # only one "Contacts" folder } else { $folders = $contactfolders; } foreach($folders as $folder) { $FindItem->Traversal = "Shallow"; $FindItem->ItemShape->BaseShape = "AllProperties"; $FindItem->ParentFolderIds->FolderId = $folder->FolderId; $result = $ews->FindItem($FindItem); $contacts[] = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Contact; } function findContact($contacts, $searchtel){ foreach ($contacts as $contacts_list) { if ($searchtel == Null) {return Null;} if (strlen($searchtel) > 7) $searchtel = substr($searchtel,-7); foreach($contacts_list as $contact) { $name = mb_convert_encoding($contact->Subject, "CP1251", "auto"); $phoneNumbers = $contact->PhoneNumbers->Entry; if ($phoneNumbers) { foreach ($phoneNumbers as $number) { $number_clean = preg_replace("/\(|\)|\-| /","", $number->_); if (substr($number_clean, -strlen($searchtel)) == $searchtel) { $foundpersons[] = $name; } } } } } return $foundpersons[0]; # return first found } Exchange дергается один раз, при желании можно даже закешировать. Далее используем функцию findContact по своему усмотрению. В ящике может быть несколько адресных книг: кроме личной папки “Контакты” могут быть списки контактов из SharePoint. Должны находиться внутри ящика, при этом теряется синхронизация с SharePoint, но достигается индивидуальность. При желании можно тянуть напрямую из SharePoint, но это здесь не рассматривается. |