我以前从未尝试过,但现在我想使用PHP获取与交换账户相关的数据(例如收件箱中的电子邮件数量和未读电子邮件的数量)。值得一提的是,PHP服务器位于与交换服务器不同的域上。
我的PHP服务器运行在:
- 系统:Linux
- PHP版本5.3.3
- cURL信息7.19.7
- cURL NTLM支持
- 启用了Soap客户端和服务器
交换正在运行:
- 版本14.1或Exchange 2010 SP1
我已经尝试了三个PHP库,它们都返回非常相似的错误。这些库包括Heartspring Exchange Web Services for PHP、PHP-EWS和EWSWrapper。
正如这三个库所要求的那样,我从交换服务器下载了三个文件,并将它们放置在PHP服务器网站目录的适当位置:
- Services.wsdl(使用大写和小写字母的第一个字母)
- messages.xsd
- types.xsd
我还将ExchangeServiceBinding
添加到Services.wsdl
中,将soap:address location
指向交换服务器的Exchange.asmx
(我测试了链接,它是正确的)。
无论使用哪个库,我都会收到非常相似的错误消息,以下是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()
我试着在服务.wsdl的服务器路径(/var/www/...)和网址路径(http://domain.com/...)之间进行切换,以及更改服务的位置,但上面错误代码中的url除外,什么都没有改变。
ExchangeWebServices.php(235)指向:
public function FindFolder($request) {
$request->getAsSOAP();
return $this->initializeSoapClient()->{__FUNCTION__}($request);
} // end function FindFolder()
看起来$request可能存在问题,因为下一条跟踪EWSWrapper.php(529)指向:
// make the actual call
$response = $this->ews->FindFolder($request);
return $response;
非常感谢您的询问,对于这个问题,经过我对Google和Stack Exchange的广泛搜索,我认为可能是types.xsd
文件的路径错误或者$request
存在问题。希望我的回答能够帮到您。
var_dump(is_readable('dirname(__FILE__).'/wsdl/types.xsd'));
的输出吗?(来自相关内容) - hek2mgl