続行する前に明確にしてください。残念ながら、ここではPHPの組み込みSOAPクラスを使用することはできません(本番サーバーのPHPはそれを使用して構築されていないため、構築されません)。
EWSを使用して、完全に外部のサーバーアプリケーションのユーザーを認証できるようにしようとしています。LDAP認証は許可されていません。Microsoftの自動検出ツールであるhttp://www.testexchangeconnectivity.com/を使用して、 EWSwsdlが正しいことを確認しました。WSDLの内容はここで見つけることができます:http://pastebin.org/214070
サーバーはSSLを使用しており、EWSのデフォルトの認証方法である「NTLM」を使用しています。
私はWebでさまざまなコード例を試しましたが、残念ながらXML、SOAP、またはcURL(ここで使用されているテクノロジーのほとんどすべて)に精通していません。私のコードの現在の反復は以下にあります:
<?php
include_once('./lib/nusoap.php');
$username = 'username@example.com';
$password = 'password';
$ews_url = 'https://owa.example.com/EWS/Exchange.asmx';
$soapclient = new nusoap_client($service, true);
$soapclient->setCredentials($username, $password, 'ntlm');
$soapclient->setUseCurl(true);
$soapclient->useHTTPPersistentConnection();
$soapclient->setCurlOption(CURLOPT_USERPWD, $username.':'.$password);
$soapclient->soap_defencoding = 'UTF-8';
$params = '<FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"';
$params += ' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Traversal="Shallow">';
$params += ' <ItemShape>';
$params += ' <t:BaseShape>IdOnly</t:BaseShape>';
$params += ' <t:AdditionalProperties>';
$params += ' <t:FieldURI FieldURI="message:From"/>';
$params += ' <t:FieldURI FieldURI="item:Subject"/>';
$params += ' <t:FieldURI FieldURI="message:IsRead"/>';
$params += ' <t:FieldURI FieldURI="item:DateTimeReceived"/>';
$params += ' <t:FieldURI FieldURI="calendar:Start"/>';
$params += ' <t:FieldURI FieldURI="calendar:End"/>';
$params += ' <t:FieldURI FieldURI="calendar:Location"/>';
$params += ' <t:FieldURI FieldURI="task:Status"/>';
$params += ' <t:FieldURI FieldURI="task:DueDate"/>';
$params += ' </t:AdditionalProperties>';
$params += ' </ItemShape>';
$params += ' <IndexedPageItemView Offset="0" MaxEntriesReturned="5" BasePoint="Beginning"/>';
$params += ' <ParentFolderIds>';
$params += ' <t:DistinguishedFolderId Id="inbox"/>';
$params += ' </ParentFolderIds>';
$params += '</FindItem>';
$operation = 'FindItem';
$namespace = '';
$soapAction = '';
$headers = false;
$result = $soapclient->call($operation, $params, $namespace, $soapAction, $headers);
echo '<pre>'; print_r($result); echo '</pre>';
if($soapclient->fault){
echo 'FAULT: ';
echo '<pre>'; print_r($result); echo '</pre>';
}else{
$err = $soapclient->getError();
if ($err) {
echo '<p><b><u>Error</u>:</b><br />' . $err . '</p>';
}else{
echo 'Connection succeeded.';
}
}
?>
私が抱えている実際の問題は、NuSOAPが「WSDLドキュメントに操作が定義されていません!」という一般的なエラーメッセージを返すことです。WSDLの外観からは、これは正しくないように思われ、コードに何かが欠けていると思われます。コード($ soapclient-> call(...))で実際のクライアント呼び出しを削除すると、コードは「接続に成功しました。」と出力しますが、試行されたNTLM認証コードの有無にかかわらずこれを実行します。
また、開発マシンで「php-ews」プロジェクトを使用しようとしましたが(同じコードは本番サーバーでは機能しませんが)、エラーを受け取らずに何にもアクセスできませんでした。
誰かがこれらの技術のいずれかについての経験があり、いくつかの説明(または起こりうるエラー)を指摘できるかもしれないなら、私はそれを大いに感謝します。私の側でさらに説明が必要な場合は、私に知らせてください。
更新1: WSDLをロードする際のエラーの1つは、NTLM認証のようです。cURLのみ(NuSOAPなし)を使用して、WSDLファイルにアクセスし、サーバーが別のエンドポイントの場所(... / EWS / Services.wsdl)にリダイレクトしていることを確認できました。
残念ながら、NuSOAPライブラリのcURL機能を使用し、NuSOAPを介して同じオプションを設定しようとしましたが、NuSOAPがWSDLファイルを表示/表示/アクセスできない場合と同じ一般的なエラーメッセージが表示されます。NuSOAPクライアントコードがすぐにエラーメッセージを返すのに対し、cURLバージョンが戻るまでに少し時間がかかるため(NTLMはマルチステップハンドシェイクプロセス)、NTLM認証である可能性があります。