PHP和Exchange Web Service(EWS)- 无法连接

5

我以前从未尝试过,但现在我想使用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 PHPPHP-EWSEWSWrapper

正如这三个库所要求的那样,我从交换服务器下载了三个文件,并将它们放置在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存在问题。希望我的回答能够帮到您。


刚刚注意到一件事情,我下载了Services.wsdl的本地副本,并添加了交换服务器SOAP地址绑定。当我现在导航到该地址(https://domain.com/EWS/Exchange.asmx),它将返回到未包含SOAP地址绑定的服务。这会有什么影响吗?我需要更新交换服务器上的services.wsdl文件吗? - Skuli Axelson
你的步骤看起来都没问题。也许是权限的问题?你有检查过 var_dump(is_readable('dirname(__FILE__).'/wsdl/types.xsd')); 的输出吗?(来自相关内容) - hek2mgl
@hek2mgl - 'var_dump' 返回 'bool(true)'。我今晚会跟踪 '__construct()'。 - Skuli Axelson
我的问题可能与PHP中的这个BUG有关: Bug #61463: cant import schema when using https soapservice - Skuli Axelson
好的,您应该考虑回答问题并添加错误报告的链接。这对其他人也可能很有趣。 - hek2mgl
显示剩余3条评论
2个回答

0

我将问题追溯到可能是PHP中的错误或者对于一些未受此错误影响的用户的可能解决方案

  1. Bug #61463: cant import schema when using https soapservice

  2. services.wsdl、types.xsd和messages.xsd存储在本地,但在services.wsdl中引用交换服务器的messages.xsd,并且在messages.xsd中引用交换服务器的types.xsd(而不是本地存储的那些由于某种原因无法在我的情况下导入)。

之后,我再也没有收到Parsing Schema: can't import schema from的错误,至少在Talking SOAP With Exchange提供的代码中如此。

实际上,我在原帖发布的服务器上仍然遇到了模式导入错误。但是在另一个运行PHP 5.2.7的测试服务器上却没有出现这个问题。我猜测PHP BUG并未影响该测试服务器。


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);
}

在这个教程中,您将找到有关使用PHP与EWS的重要信息。


谢谢hek2mgl - 尽管您提供了上述代码,但我仍然遇到相同的错误。 - Skuli Axelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接