首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP和Exchange服务(EWS) -无法连接

PHP和Exchange服务(EWS) -无法连接
EN

Stack Overflow用户
提问于 2012-12-18 16:09:58
回答 2查看 5.8K关注 0票数 5

我以前从未尝试过这种方法,但我尝试使用PHP获取有关exchange帐户的数据(例如,收件箱中的电子邮件数量和收件箱中未读邮件的数量)。为了记录在案,PHP服务器位于与exchange服务器不同的域中。

我的服务器正在运行:

  • 系统: Linux
  • PHP版本5.3.3
  • cURL信息7.19.7
  • cURL NTLM是
  • 启用Soap客户端和服务器

Excahnge正在运行:

  • 版本14.1或Exchange2010 SP1

我尝试了3个PHP库,它们都返回了一个非常相似的错误。用于PHP的心跳交换Web服务PHP-EWSEWSWrapper库。

根据所有3个库的要求,我从exchange服务器下载了这三个文件,并将它们放在PHP服务器web目录中的适当位置:

  • Services.wsdl (使用大写和大写首字母)
  • messages.xsd
  • types.xsd

我还将ExchangeServiceBinding添加到Services.wsdl中,并将soap:address location指向exchange Exchange.asmx (我测试了链接,它是正确的)。

我在所有3个库中都得到了一个非常类似的错误消息,下面是来自EWSWrapper的完整错误:

代码语言:javascript
复制
    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指向:

代码语言:javascript
复制
parent::__construct($wsdl, $options);

ExchangeWebServices.php(483)指向:

代码语言:javascript
复制
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/.)还有到services.wsdl和服务器位置的web url路径(web,http://domain.com/...),这对上面错误代码中的url没有任何影响。

ExcahngeWebServices.php(235)指向:

代码语言:javascript
复制
public function FindFolder($request) {
        $request->getAsSOAP();
        return $this->initializeSoapClient()->{__FUNCTION__}($request);
    } // end function FindFolder()

正如下一个跟踪EWSWrapper.php(529)指向的那样,$request似乎有问题:

代码语言:javascript
复制
// make the actual call
        $response = $this->ews->FindFolder($request);

        return $response;

任何帮助都将受到赞赏,因为广泛的谷歌和堆栈交换搜索没有帮助。我认为通向types.xsd的路径是错误的,或者$request有什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-19 09:43:46

对于某些不受bug影响的用户,我将问题追溯到可能的Bug in PHPpossible solution

  1. Bug #61463:不能在使用https soapservice时导入模式
  2. 在本地存储services.wsdl, types.xsd and messages.xsd,但将services.wsdl中的模式导入引用到exchange messages.xsd,在messages.xsd中也将模式导入引用到exchange types.xsd (而不是由于某些原因无法导入的本地存储的types.xsd)。

在此之后,至少在Parsing Schema: can't import schema from中提供的代码中,我不再获得与Exchange谈肥皂错误。

实际上,我仍然在最初的帖子中在发布的服务器上获得schema import error。但不是在另一个运行PHP5.2.7的测试服务器上。我猜PHP错误并没有影响到测试服务器。

票数 0
EN

Stack Overflow用户

发布于 2012-12-18 17:42:50

此示例使用PHP内部类SoapClient显示Microsoft 2010日历项的主题。要使它正常工作,您必须下载并修改'services.wsdl‘、’the es.xsd‘、'messages.xsd’,就像提问者提到的那样。预期这些文件与php文件位于同一个文件夹中。

代码语言:javascript
复制
<?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的重要信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13936998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档