我之前从未尝试过这个,但我正在尝试使用PHP来获取有关交换帐户的数据(例如收件箱中的电子邮件数量以及收件箱中未读电子邮件的数量)。仅供记录,PHP服务器与交换服务器位于不同的域。
我的PHP服务器正在运行:
- 系统:Linux
- PHP Version 5.3.3
- cURL信息7.19.7
- cURL NTLM是
- 启用Soap客户端和服务器
Excahnge正在运行:
- 版本14.1或Exchange 2010 SP1
我已经尝试了3个PHP库,它们都返回了一个非常相似的错误。 Heartspring Exchange Web Services for PHP,PHP-EWS和EWSWrapper库。
正如所有3个图书馆所需,我从交换服务器下载了这三个文件,并将它们放在PHP服务器web目录的相应位置:
- Services.wsdl(使用大写和lovercase第一个字母)
- messages.xsd
- types.xsd
我还将ExchangeServiceBinding
添加到Services.wsdl
并将soap:address location
指向交换服务器Exchange.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()
在那里,我尝试将服务器路径(/ var / www / ...)以及web url路径(http://domain.com / ...)添加到services.wsdl以及服务器位置,这改变了上面的错误代码中的url的任何内容。
ExcahngeWebServices.php(235)指向:
public function FindFolder($request) {
$request->getAsSOAP();
return $this->initializeSoapClient()->{__FUNCTION__}($request);
} // end function FindFolder()
似乎$请求可能存在问题,因为下一个跟踪 EWSWrapper.php(529)指向:
// make the actual call
$response = $this->ews->FindFolder($request);
return $response;
任何帮助都会受到赞赏,因为广泛的Google和Stack Exchange搜索没有帮助。我认为types.xsd
的路径错误或$request
出错了。
答案 0 :(得分:0)
此示例使用PHP内部类SoapClient显示Microsoft Exchange 2010日历项的主题。为了使它工作,你将不得不下载和修改'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);
}
您可以在此tutorial
中找到有关将PHP与EWS一起使用的重要信息答案 1 :(得分:0)
对于那些不受错误影响的用户,我将问题跟踪到可能的Bug in PHP
或possible solution
:
在本地存储services.wsdl, types.xsd and messages.xsd
但将services.wsdl
中的架构导入引用到交换服务器messages.xsd
以及messages.xsd
中将架构导入引用到交换服务器{ {1}}(而不是在我的情况下由于某种原因无法导入的本地存储的那些)。
之后,我至少在Talking SOAP With Exchange中提供的代码中不再出现types.xsd
错误。
我实际上仍然在原始帖子中的已发布服务器上获得Parsing Schema: can't import schema from
。但不是在运行PHP 5.2.7的另一个测试服务器上。我猜测PHP BUG没有影响该测试服务器。