+ Antworten
Seite 1 von 11 1 2 3 ... LetzteLetzte
Ergebnis 1 bis 10 von 105
  1. #1
    Registriert seit
    Mar 2006
    Beiträge
    19

    Question Gelöst: Exchange EWS und PHP SOAP

    Hallo,

    ************************************************** *
    UPDATE 2010-01-10:
    mit Version 2.2 funktioniert es, da hier PHP 5.3.1 an Board ist.
    ************************************************** *


    habe zuhause Exchange 2007 und würde gerne meine Termine und Mails über PHP und IPS anschauen. Nach einigem googlen habe ich dann die folgende Seite gefunden: Talking-SOAP-with-Exchange und war dann zum Teil erfolgreich

    Kurze Erklärung:
    Man braucht natürlich php_soap.dll und php_curl.dll und noch die ssleay32.dll Hier runterzuladen

    Im Verzeichnis "scripts" fehlen jetzt noch drei Dateien.
    Services.wsdl, types.xsd und messages.xsd
    Alle drei runter zu laden vom Exchange Server:
    https://exchange.example.com/EWS/types.xsd
    https://exchange.example.com/EWS/messages.xsd
    https://exchange.example.com/EWS/Services.wsdl

    Bei Services.wsdl noch das nächste Textblock VOR der letzten Zeile hinzufügen:
    Code:
            <wsdl:service name="ExchangeServices">
                <wsdl:port name="ExchangeServicePort" binding="tns:ExchangeServiceBinding">
                    <soap:address location="https://exchange.example.com/EWS/Exchange.asmx"/>
                </wsdl:port>
            </wsdl:service>
    Der PHP Quellcode ist folgender: (Achtung:2x Mailadresse ändern)
    PHP-Code:
    <?
    /*
    *******************************
     IP-SYMCON Event Scripting
    *******************************
    File     : calendar_pb.ips.php
    Trigger  : 
    Interval : 
    */

    class NTLMSoapClient extends SoapClient {
        function 
    __doRequest($request$location$action$version) {
            
    $headers = array(
                
    'Method: POST',
                
    'Connection: Keep-Alive',
                
    'User-Agent: PHP-SOAP-CURL',
                
    'Content-Type: text/xml; charset=utf-8',
                
    'SOAPAction: "'.$action.'"',
            );
            
    $this->__last_request_headers $headers;
            
    $ch curl_init($location);
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($chCURLOPT_HTTPHEADER$headers);
            
    curl_setopt($chCURLOPT_POSTtrue );
            
    curl_setopt($chCURLOPT_POSTFIELDS$request);
            
    curl_setopt($chCURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_1_1);
            
    curl_setopt($chCURLOPT_HTTPAUTHCURLAUTH_NTLM);
            
    curl_setopt($chCURLOPT_USERPWD$this->user.':'.$this->password);
            
    curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
            
    curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);

            
    $response curl_exec($ch);
            return 
    $response;
        }
        function 
    __getLastRequestHeaders() {
            return 
    implode("n"$this->__last_request_headers)."n";
        }
    }



    class 
    ExchangeNTLMSoapClient extends NTLMSoapClient {
        protected 
    $user 'deine@mail.adresse';    // evtl. 'Domäne\\User' 
        
    protected $password 'kennwort';
    }


    class 
    NTLMStream {
        private 
    $path;
        private 
    $mode;
        private 
    $options;
        private 
    $opened_path;
        private 
    $buffer;
        private 
    $pos;

        public function 
    stream_open($path$mode$options$opened_path) {
            echo 
    "[NTLMStream::stream_open] $path , mode=$mode n";
            
    $this->path $path;
            
    $this->mode $mode;
            
    $this->options $options;
            
    $this->opened_path $opened_path;
            
    $this->createBuffer($path);
            return 
    true;
        }

        public function 
    stream_close() {
            echo 
    "[NTLMStream::stream_close] n";
            
    curl_close($this->ch);
        }

        public function 
    stream_read($count) {
            echo 
    "[NTLMStream::stream_read] $count n";
            if(
    strlen($this->buffer) == 0) {
                return 
    false;
            }
            
    $read substr($this->buffer,$this->pos$count);
            
    $this->pos += $count;
            return 
    $read;
        }

        public function 
    stream_write($data) {
            echo 
    "[NTLMStream::stream_write] n";
            if(
    strlen($this->buffer) == 0) {
                return 
    false;
            }
            return 
    true;
        }

        public function 
    stream_eof() {
            echo 
    "[NTLMStream::stream_eof] ";
            if(
    $this->pos strlen($this->buffer)) {
                echo 
    "true n";
                return 
    true;
            }
            echo 
    "false n";
            return 
    false;
        }

        
    /* return the position of the current read pointer */
        
    public function stream_tell() {
            echo 
    "[NTLMStream::stream_tell] n";
            return 
    $this->pos;
        }

        public function 
    stream_flush() {
            echo 
    "[NTLMStream::stream_flush] n";
            
    $this->buffer null;
            
    $this->pos null;
        }

        public function 
    stream_stat() {
            echo 
    "[NTLMStream::stream_stat] n";
            
    $this->createBuffer($this->path);
            
    $stat = array(
                
    'size' => strlen($this->buffer),
            );
            return 
    $stat;
        }

        public function 
    url_stat($path$flags) {
            echo 
    "[NTLMStream::url_stat] n";
            
    $this->createBuffer($path);
            
    $stat = array(
                
    'size' => strlen($this->buffer),
            );
            return 
    $stat;
        }

        
    /* Create the buffer by requesting the url through cURL */
        
    private function createBuffer($path) {
            if(
    $this->buffer) {
                return;
            }
            echo 
    "[NTLMStream::createBuffer] create buffer from : $pathn";
            
    $this->ch curl_init($path);
            
    curl_setopt($this->chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($this->chCURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_1_1);
            
    curl_setopt($this->chCURLOPT_HTTPAUTHCURLAUTH_NTLM);
            
    curl_setopt($this->chCURLOPT_USERPWD$this->user.':'.$this->password);
            echo 
    $this->buffer curl_exec($this->ch);
            echo 
    "[NTLMStream::createBuffer] buffer size : ".strlen($this->buffer)."bytesn";
            
    $this->pos 0;
        }
    }


    class 
    ExchangeNTLMStream extends NTLMStream {
        protected 
    $user 'deine@mail.adresse';    // evtl. 'Domäne\\User' 
        
    protected $password 'kennwort';
    }


    //verändert: erst wenn https registriert ist, unregistrieren
    $existed in_array("https"stream_get_wrappers());
    if (
    $existed) {
        
    stream_wrapper_unregister("https");

        
    stream_wrapper_register('https''ExchangeNTLMStream') or die("Failed to register protocol");
        
    $wsdl "services.wsdl";
        
    $client = new ExchangeNTLMSoapClient($wsdl);

        
    /* Do something with the web service connection */
        
    stream_wrapper_restore('https');
        }
        else {
            
    stream_wrapper_register('https''ExchangeNTLMStream') or die("Failed to register protocol");
            
    $wsdl "services.wsdl";
            
    $client = new ExchangeNTLMSoapClient($wsdl);
    }



    print_r($client->__getFunctions());

    ?>
    Es ist mir schon gelungen einen Termineintrag zu erstellen.
    PHP-Code:
    $CreateItem->SendMeetingInvitations "SendToNone";
    $CreateItem->SavedItemFolderId->DistinguishedFolderId->Id "calendar";
    $CreateItem->Items->CalendarItem = array();
    for(
    $i 0$i 1$i++) {
        
    $CreateItem->Items->CalendarItem[$i]->Subject "Hello from PHP";
        
    $CreateItem->Items->CalendarItem[$i]->Start "2010-01-01T16:00:00Z"# ISO date format. Z denotes UTC time
        
    $CreateItem->Items->CalendarItem[$i]->End "2010-01-01T17:00:00Z";
        
    $CreateItem->Items->CalendarItem[$i]->IsAllDayEvent false;
        
    $CreateItem->Items->CalendarItem[$i]->LegacyFreeBusyStatus "Busy";
        
    $CreateItem->Items->CalendarItem[$i]->Location "Bahamas";
        
    $CreateItem->Items->CalendarItem[$i]->Categories->String "MyCategory";
    }
    $result $client->CreateItem($CreateItem);
    print_r($result); 
    Leider klappt es nicht eine Suche zu starten... (Quellcode: )
    PHP-Code:
        $FindItem->Traversal "Shallow";
        
    $FindItem->ItemShape->BaseShape "AllProperties";
        
    $FindItem->ParentFolderIds->DistinguishedFolderId->Id "calendar";
        
    $FindItem->CalendarView->StartDate "2008-12-01T00:00:00Z";
        
    $FindItem->CalendarView->EndDate "2008-12-31T00:00:00Z";
        
    $result $client->FindItem($FindItem);
        
    $calendaritems $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->CalendarItem;
        foreach(
    $calendaritems as $item) {
            echo 
    $item->Subject."n";
        } 
    Output:
    Code:
    <br />
    <b>Fatal error</b>:  Uncaught SoapFault exception: [soap11:Client] The request failed schema validation:
    The element 'FindItem' in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages' has
    incomplete content. List of possible elements expected: 'GroupBy, DistinguishedGroupBy, Restriction, SortOrder,
    ParentFolderIds' in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages'. in 
    C:\Program Files\IP-SYMCON\scripts\.currentscript:192
    Stack trace:
    #0 [internal function]: SoapClient-&gt;__call('FindItem', Array)
    #1 C:\Program Files\IP-SYMCON\scripts\.currentscript(192): ExchangeNTLMSoapClient-&gt;FindItem(Object(stdClass))
    #2 {main}
      thrown in <b>C:\Program Files\IP-SYMCON\scripts\.currentscript</b> on line <b>192</b><br />
    oder


    PHP-Code:
        $FindFolder->Traversal "Shallow";
        
    $FindFolder->FolderShape->BaseShape "Default";
        
    $FindFolder->ParentFolderIds->DistinguishedFolderId->Id "root";
        
    $result $client->FindFolder($FindFolder);
        
    $folders $result->ResponseMessages->FindFolderResponseMessage->RootFolder->Folders->Folder;
        foreach(
    $folders as $folder) {
            echo 
    $folder->DisplayName."n";
        } 
    Output:
    Code:
    <br />
    <b>Fatal error</b>:  Uncaught SoapFault exception: [soap11:Client] The request failed schema validation:
    The element 'FindFolder' in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages'
    has incomplete content. List of possible elements expected: 'IndexedPageFolderView, FractionalPageFolderView,
    Restriction, ParentFolderIds' in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages'.
    in C:\Program Files\IP-SYMCON\scripts\.currentscript:179
    Stack trace:
    #0 [internal function]: SoapClient-&gt;__call('FindFolder', Array)
    #1 C:\Program Files\IP-SYMCON\scripts\.currentscript(179): ExchangeNTLMSoapClient-&gt;FindFolder(Object(stdClass))
    #2 {main}
      thrown in <b>C:\Program Files\IP-SYMCON\scripts\.currentscript</b> on line <b>179</b><br />
    Wer von euch kann mir helfen dieses Problem zu lösen?

    danke
    oortmanp
    Geändert von wgreipl (05.08.11 um 10:06 Uhr) Grund: quellcode termineintrag verändert

  2. #2
    Registriert seit
    Mar 2006
    Beiträge
    19

    weiß denn kein Web/SOAP Designer wie man dies lösen kann?

  3. #3
    Registriert seit
    Feb 2005
    Ort
    Lübeck
    Beiträge
    21,886

    Ich bezweifle, dass dir jemand bei dem Problem helfen kann.

    Es gibt hier kaum Exchange Nutzer, und noch weniger die SOAP können und noch weniger die beides im Zusammenhang nutzen, um dir bei bei deinem sehr speziellen Problem helfen zu können.

    Ich würde lieber in einem Exchange Forum fragen - Dein PHP Skript geht ja auch unter dem normalen Apache und ist nicht an IPS gebunden.

    paresy

  4. #4
    Registriert seit
    May 2005
    Beiträge
    2,278

    so aus dem Bauch raus würde ich sagen, die Schemabeschreibung passt nicht zu dem, was der Server wirklich anbietet. Kann es sein, das das Beispiel für eine ältere Version von Exchange gemacht wurde?
    PHP-Code:
    The request failed schema validation:
    The element 'FindFolder' in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages'
    has incomplete content. List of possible elements expected'IndexedPageFolderView, FractionalPageFolderView,
    Restriction, ParentFolderIds' 
    in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages'
    Du solltest diesem Fehler mal nachgehen.

    Tommi

  5. #5
    Registriert seit
    Mar 2006
    Beiträge
    19

    Zitat Zitat von tommi Beitrag anzeigen
    Kann es sein, das das Beispiel für eine ältere Version von Exchange gemacht wurde?
    EWS gibt es erst seit der Version 2007. Vielleicht liegt es ja an der php_soap.dll Version. Hier wurde schon einiges drüber berichtet in dem Forum wo ich den Beitrag her habe. Werde mich da mal schlau machen und evt (separat) ne neue PHP Version installieren.

    Falls diese theoretische Lösung evt. was bringen würde, wäre das Problem meines Erachtens für IPS ja (noch) nicht gelöst. Oder könnte man auch die PHP Version in IPS updaten?

    gruss
    oortmanp

  6. #6
    Registriert seit
    May 2005
    Beiträge
    2,278

    Du kannst das PHP nicht austauschen, aber Du könntest versuchen, eine neuere SOAP-Extension gegen die php 5.1.6 zu linken.
    Ansonsten bleibt nur der Weg über einen externen Server/ externes Programm oder die wacklige PHP COM-Bridge, mit der man externe Komponenten ansprechen kann.

    Tommi

  7. #7
    Registriert seit
    Mar 2006
    Beiträge
    19

    Zitat Zitat von tommi Beitrag anzeigen
    Du kannst das PHP nicht austauschen, aber Du könntest versuchen, eine neuere SOAP-Extension gegen die php 5.1.6 zu linken.
    Ansonsten bleibt nur der Weg über einen externen Server/ externes Programm oder die wacklige PHP COM-Bridge, mit der man externe Komponenten ansprechen kann.

    Tommi
    Die Möglichkeiten werde ich dann mal (die Reihe nach) versuchen.

    Habe nämlich soeben sowohl die version 5.2.10 und die 5.1.6 für windows runtergeladen und beide mal mit dem EWS script ausprobiert.
    Ergebnis:
    5.2.10 alles ok
    5.1.6 die gepostete SoapFault exeption

    werde dann berichten wie de Ergebnisse sind

    gruß
    oortmanp

  8. #8
    Registriert seit
    Aug 2005
    Ort
    Fürstenfeldbruck-Aich (Bayern)
    Beiträge
    4,048

    Hallo oortmanp,

    als erstes Danke für deine Anleitung.

    Mit Freude kann ich dir mitteilen das der Zugriff mit deiner Anleitung bei mir funktoniert, muß aber auch sagen das ich die 2.2ß nutze und dort PHP 5.3.1 an Board ist.

    Nun muss ich das Ganze mal ausbauen um die zurückgeliefert Werte in IPS auswerten zu können.
    Gruß
    Werner

    Komponenten:: Homematic(CCU) 250DP, EATON-MOELLER, 1-Wire, WMRS200, 15" Touchdisplay
    Software::
    IPS V4.x, iMobile, WebFront, Logitech Media Server 7.8.x, SONOS
    Hardware:: IPS-Server: ESXi 6.x, Windows 10 Ent, 4 Kerne, 8GB RAM

  9. #9
    Registriert seit
    Mar 2006
    Beiträge
    19

    Hi wgreipl

    das sind gute Nachrichten! Ich bin selber noch nicht weiter gekommen mit ne PHP-bridge oder es ueber den IIS server laufen zu lassen. Aber die Version 2.2 ist dann vielversprechend!

    Danke fuer die Info

    Gruss
    oortmanp

  10. #10
    Registriert seit
    Jan 2007
    Ort
    Ulm
    Beiträge
    310

    Hallo,

    kann auch bestätigen, dass es mit Exchange 2010 läuft.

    Gruss
    Michael

Ähnliche Themen

  1. SOAP in PHP verwenden
    Von ratzefumm im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 5
    Letzter Beitrag: 28.06.09, 14:43
  2. SOAP + Ajax in eigenen Webapplikationen in PHP
    Von ratzefumm im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 3
    Letzter Beitrag: 26.04.09, 19:01
  3. Problem - PHP version 5.1 und extensions
    Von daniel1005 im Forum Allgemeine Diskussion
    Antworten: 4
    Letzter Beitrag: 30.11.05, 21:29