AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Exchange Web Services

Биллинг 1 сообщений -
#1

Может кому пригодится в организации, где используется почтовая система MS Exchange.

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, но это здесь не рассматривается.