2016-06-21 61 views
0

我正在編寫一個php腳本來讀取Exchange Server 2010中的電子郵件。目前,我能夠檢索所有未讀電子郵件,但我想標記我擁有的電子郵件檢索爲已讀,因此我不檢索已經檢索到的郵件。我正在使用github的php-ews。我創建了一個腳本來執行此操作,但每次運行時,我都會在調用UpdateItem時出現此錯誤。PHP-EWS:爲消息設置IsRead標誌

PHP Fatal error: SOAP-ERROR: Encoding: object has no 'Path' property 
    Stack Trace: 
    #0 ExchangeClient.php(355): SoapClient->__call('UpdateItem', Array) 
    #1 ExchangeClient.php(355): NTLMSoapClient->UpdateItem(Object(UpdateItemType)) 
    #2 markReadTest.php(20): ExchangeClient->mark_as_read(Object(stdClass)) 
    #3 ExchangeClient.php on line 355 

我注意到肯定,因爲我覺得我所有的SOAP嵌套是正確的,因爲我已經提到Microsoft's EWS SOAP reference爲的updateItem功能是什麼原因造成這個錯誤。以下是我用來將郵件標記爲已讀的腳本的代碼。

public function mark_as_read($ReadMessage) 
    { 
     $request = new EWSType_UpdateItemType(); 
     $request->MessageDisposition = 'SaveOnly'; 
     $request->ConflictResolution = 'AlwaysOverwrite'; 
     $request->ItemChanges = array(); 

     $change = new EWSType_ItemChangeType(); 
     $change->ItemId = new EWSType_ItemIdType(); 
     $change->ItemId->Id = $ReadMessage->ItemId->Id; 
     $change->ItemId->ChangeKey = $ReadMessage->ItemId->ChangeKey; 

     $field = new EWSType_SetItemFieldType(); 
     $field->FieldURI = new EWSType_PathToUnindexedFieldType(); 
     $field->FieldURI->FieldURI = 'message:IsRead'; 
     $field->Message = new EWSType_MessageType(); 
     $field->Message->IsRead = True; 

     $change->Updates->SetItemField[] = $field; 

     $request->ItemChanges[] = $change; 

     $response = $this->client->UpdateItem($request); 
     return $response; 
    } 

回答

0

經過一番研究,我發現一條評論提供了關於通過PHP SOAPclient連接到EWS的howtoforge post上的解決方案。解決方案是用types.xsd文件中的FieldURI元素替換路徑元素。

原始XML標籤:

<xs:element ref="t:Path"/> 

替換日期:

<xs:element ref="t:FieldURI"/> 
<xs:element ref="t:IndexedFieldURI"/> 
<xs:element ref="t:ExtendedFieldURI"/> 

此路徑元素髮生8次在我的版本types.xsd的,我從Exchange 2013 SP1服務器和我用FieldURI元素替換它的所有實例。之後,我做了這個,我能夠將郵件標記爲已讀,而無需修改我在我的問題中使用的代碼

0

兩件事情,也許這樣做首先你應該在IsReadSpecified屬性設置爲true如

`$請求=新EWSType_UpdateItemType(); $ request-> MessageDisposition ='SaveOnly'; $ request-> ConflictResolution ='AlwaysOverwrite'; $ request-> ItemChanges = array();

$change = new EWSType_ItemChangeType(); 
    $change->ItemId = new EWSType_ItemIdType(); 
    $change->ItemId->Id = $ReadMessage->ItemId->Id; 
    $change->ItemId->ChangeKey = $ReadMessage->ItemId->ChangeKey; 

    $field = new EWSType_SetItemFieldType(); 
    $field->FieldURI = new EWSType_PathToUnindexedFieldType(); 
    $field->FieldURI->FieldURI = 'message:IsRead'; 
    $field->Message = new EWSType_MessageType(); 
    $field->Message->IsReadSpecified = true; 
    $field->Message->IsRead = true; 

    $change->Updates->SetItemField[] = $field; 

    $request->ItemChanges[] = $change; 

    $response = $this->client->UpdateItem($request); 
    return $response; 

此外,你可能想看看你的代碼是提交給服務器併發布的請求SOAP。它通常比SOAP更清楚你所做的不正確。

+0

我嘗試使用SoapClient的__getLastRequest()和__getLastResponse()從服務器轉儲發送和接收的XML。 '功能。但是,即使發送請求,我的代碼仍然失敗。我會用堆棧跟蹤來更新我的問題,它顯示了我最初忽略的內容。 – linuxjedi