5

これまで試したことはありませんが、PHPを使用してExchangeアカウントに関するデータ(たとえば、受信トレイ内の電子メールの数や受信トレイ内の未読電子メールの量)を取得しようとしています。念のために言っておきますが、PHPサーバーはExchangeサーバーとは別のドメインにあります。

私のPHPサーバーは次の場所で実行されています:
-システム:Linux
-PHPバージョン5.3.3
-cURL情報7.19.7
-cURLNTLMはい-Soap
クライアントとサーバーが有効

Excahngeが実行されています:
-バージョン14.1またはExchange 2010 SP1

私は3つのPHPライブラリを試しましたが、すべて非常によく似たエラーを返します。PHP 、PHP-EWS、およびEWSWrapperライブラリ用のHeartspringExchangeWebサービス。

3つのライブラリすべてに必要なため、Exchangeサーバーから3つのファイルをダウンロードし、PHPサーバーのWebディレクトリの適切な場所に配置しました
。--Services.wsdl(大文字と恋人の両方の最初の文字を使用)
--messages.xsd
--types.xsd

また、Exchangeサーバーにを追加しExchangeServiceBindingServices.wsdlポイントしました(リンクをテストしましたが、正しいです)。soap:address locationExchange.asmx

3つのライブラリすべてで非常によく似たエラーメッセージが表示されます。これがEWSWrapperからの完全なエラーです。

    Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: 
    Parsing Schema: can't import schema from 
    '/var/www/vhosts/domain.com/EWSWrapper/wsdl/types.xsd'in 
    /var/www/vhosts/domain.com/EWSWrapper/NTLMSoapClient/Exchange.php:52 
    Stack trace: #0 
    /var/www/vhosts/domain.com/EWSWrapper/NTLMSoapClient/Exchange.php(52):
    SoapClient->SoapClient('/var/www/vhosts...', Array) 
    #1 
    /var/www/vhosts/domain.com/EWSWrapper/ExchangeWebServices.php(483): 
    NTLMSoapClient_Exchange->__construct('/var/www/vhosts...', Array) 
    #2 
    /var/www/vhosts/domain.com/EWSWrapper/ExchangeWebServices.php(235): 
    ExchangeWebServices->initializeSoapClient() 
    #3 
    /var/www/vhosts/domain.com/EWSWrapper/EWSWrapper.php(529): 
    ExchangeWebServices->FindFolder(Object(EWSType_FindFolderType)) 
    #4 
    /var/www/vhosts/domain.com/EWSWrapper/test in
    /var/www/vhosts/domain.com/EWSWrapper/NTLMSoapClient/Exchange.php on line 52

Exchange.php:52は次のことを示しています。

parent::__construct($wsdl, $options);

ExchangeWebServices.php(483)は次のことを示しています。

protected function initializeSoapClient() {
        return new NTLMSoapClient_Exchange(
            dirname(__FILE__).'/wsdl/services.wsdl',
            array(
                'user' => $this->username,
                'password' => $this->password,
                'location' => 'https://'.$this->server.'/EWS/Exchange.asmx',
            )); // end return
    } // end function initializeSoapClient()

そこで、services.wsdlへのサーバーパス(/ var / www / ...)とWeb URLパス(http://domain.com / ...)、およびサーバーの場所を設定してみましたが、何も変わりません。上記のエラーコードのURLを除きます。

ExcahngeWebServices.php(235)は次のことを示しています。

public function FindFolder($request) {
        $request->getAsSOAP();
        return $this->initializeSoapClient()->{__FUNCTION__}($request);
    } // end function FindFolder()

次のトレースEWSWrapper.php(529)が示すように、$requestに問題がある可能性があります。

// make the actual call
        $response = $this->ews->FindFolder($request);

        return $response;

グーグルとスタックエクスチェンジの大規模な検索は役に立たなかったので、どんな助けでもありがたいです。types.xsdへの道が間違っているか、何かが間違っていると思います$request

4

2 に答える 2

0

この例では、PHP内部クラスSoapClientを使用して、MicrosoftExchange2010カレンダーアイテムの件名を表示します。それを機能させるには、質問者が述べたように、「services.wsdl」、「types.xsd」、「messages.xsd」をダウンロードして変更する必要があります。これらのファイルは、phpファイルと同じフォルダーにあることが期待されています。

<?php

ini_set('display_errors', '1'); // for debugging
$server = "192.168.0.23";
$wsdl = "file:///" . dirname(__FILE__) . "/services.wsdl";

// valid login credentials
$options = array (
    'login' => 'test@test.net',
    'password' => 'secret'
);

$client = new SoapClient($wsdl, $options);
printf("Connected to %s%s", $server, PHP_EOL);

$FindItem->Traversal = "Shallow";
$FindItem->ItemShape->BaseShape = "AllProperties";
$FindItem->ParentFolderIds->DistinguishedFolderId->Id = "calendar";
$FindItem->CalendarView->StartDate = "2012-08-01T00:00:00Z";
$FindItem->CalendarView->EndDate = "2012-08-31T00:00:00Z";
$result = $client->FindItem($FindItem);
$calendaritems = $result
  ->ResponseMessages
  ->FindItemResponseMessage
  ->RootFolder
  ->Items
  ->CalendarItem;

foreach($calendaritems as $item) { 
    printf("%s%s", $item["Subject"], PHP_EOL);
}

このチュートリアルでは、PHPでのEWSの使用に関する重要な情報を見つけることができます。

于 2012-12-18T17:42:50.050 に答える
0

私は、バグの影響を受けていない可能性のあるBug in PHP、または一部のユーザーの問題を追跡しました。possible solution

  1. バグ#61463:httpssoapserviceを使用しているときにスキーマをインポートできない

  2. services.wsdl, types.xsd and messages.xsdローカルに保存しますが、スキーマのインポートをservices.wsdlExchangeサーバーmessages.xsdmessages.xsd参照し、スキーマのインポートをExchangeサーバーに参照しますtypes.xsd(私の場合、何らかの理由でインポートできないローカルに保存されたサーバーの代わりに)。

その後、Parsing Schema: can't import schema from少なくともTalking SOAPWithExchangeで提供されているコードでエラーが発生しなくなりました。

私は実際にはまだschema import error元の投稿で投稿されたサーバーを取得しています。ただし、PHP5.2.7を実行している別のテストサーバーでは使用できません。PHPのバグはそのテストサーバーに影響を与えていないと思います。

于 2012-12-19T09:43:46.137 に答える