2012-09-10 42 views
4

我已經能夠使用php-ews API成功檢索Exchange 2010收件箱中的未讀電子郵件。然而,在我獲取電子郵件後,我想將電子郵件的IsRead屬性設置爲true,以便下次收到電子郵件時不會顯示這些消息。PHP-EWS 2010,如何設置IsRead標誌

以前有人做過這個嗎?

編輯:

這是我想設置的IsRead標誌:

$message_id = ''; //id of message 
$change_key = ''; //change key 
$response = $ews->GetItem($request); 
     //print_r($response);exit; 
     if($response->ResponseMessages->GetItemResponseMessage->ResponseCode == 'NoError' && 
      $response->ResponseMessages->GetItemResponseMessage->ResponseClass == 'Success') { 

      $a = array(); 
      $message = $response->ResponseMessages->GetItemResponseMessage->Items->Message; 

      $a['message_body'] = $message->Body->_; 
      $a['sender'] = $message->From->Mailbox->EmailAddress; 
      $a['subject'] = $message->ConversationTopic; 

      $data[] = $a; 
      //process the message data. 

      $messageType = new EWSType_MessageType(); 
      $messageType->IsRead = true; 

      $path = new EWSType_PathToUnindexedFieldType(); 
      $path->FieldURI = 'message:IsRead'; 

      $setField = new EWSType_SetItemFieldType(); 
      $setField->Message = $messageType; 
      $setField->FieldURI = $path; 


      $u = new EWSType_ItemChangeType(); 
      $u->Updates = new EWSType_NonEmptyArrayOfItemChangeDescriptionsType(); 
      $u->Updates->SetItemField = $setField; 
      $u->ItemId = new EWSType_ItemIdType(); 
      $u->ItemId->Id = $message_id; 
      $u->ItemId->ChangeKey = $change_key; 

      $updatedItems = new EWSType_NonEmptyArrayOfItemChangesType(); 
      $updatedItems->ItemChange = $u; 

      $updateMessenger = new EWSType_UpdateItemType(); 
      $updateMessenger->ItemChanges = $updatedItems; 
      $updateMessenger->MessageDisposition = 'SaveOnly'; 
      $updateMessenger->ConflictResolution = 'AutoResolve'; 

      try { 
       $update_response = $ews->UpdateItem($updateMessenger); 
      }catch (Exception $e){ 
       echo $e->getMessage(); 
      } 
     } 

當我跑我得到以下錯誤的文件:

An internal server error occurred. The operation failed. 

的調試後有一段時間,我得出結論,錯誤發生在NTLMSoapClient.php文件的curl_exec函數中。

我不知道該從哪裏繼續。請幫忙。

+0

嗨,我自己發現了這個問題。原來,這是因爲我創建ews對象時指定的Exchange版本。 updateItem函數執行但會引發此錯誤:更改描述中的對象必須包含一個且只有一個要修改的屬性。有任何想法嗎 ? – Lin

回答

0

更新日曆事件並設置IsAllDayEvent標誌時,我遇到過類似的問題。這是爲我工作的代碼:

$ews = new ExchangeWebServices(...); 

$request = new EWSType_UpdateItemType(); 
$request->ConflictResolution = 'AlwaysOverwrite'; 
$request->ItemChanges = array(); 

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

$field = new EWSType_SetItemFieldType(); 
$field->FieldURI = new EWSType_PathToUnindexedFieldType(); 
$field->FieldURI->FieldURI = "calendar:IsAllDayEvent"; 
$field->CalendarItem = new EWSType_CalendarItemType(); 
$field->CalendarItem->IsAllDayEvent = true; 

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

$request->ItemChanges[] = $change; 
$response = $ews->UpdateItem($request); 

我在這裏看到的最大的區別是,你$u->Updates->SetItemField = $setField;,而我的代碼使用$u->Updates->SetItemField[] = $setField;

我希望這會有所幫助。

編輯:您可能已經看到了這個,但是我的代碼來自php-ews wiki

0

我什麼都試過,包括PathToExtendedFieldType,並沒有在最後的代碼工作,下面爲我工作

$ews = new ExchangeWebServices('red', 'red', 'red',ExchangeWebServices::VERSION_2007_SP1); 

$request = new EWSType_UpdateItemType(); 

$request->SendMeetingInvitationsOrCancellations = 'SendToNone'; 
$request->MessageDisposition = 'SaveOnly'; 
$request->ConflictResolution = 'AlwaysOverwrite'; 
$request->ItemChanges = array(); 

// Build out item change request. 
$change = new EWSType_ItemChangeType(); 
$change->ItemId = new EWSType_ItemIdType(); 
$change->ItemId->Id = $contact_id; 
$change->ItemId->ChangeKey = $contact_change_key; 
#$change->Updates = new EWSType_NonEmptyArrayOfItemChangeDescriptionsType(); 

#$change->Updates->SetItemField = array(); 

// Build the set item field object and set the item on it. 
$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 = $ews->UpdateItem($request); 
var_dump($response); 
0

好了,我不知道它是如何在PHP,但在C#中還有另外一個領域,即必須設置:IsReadSpecified = true。

email.IsRead = true; 
email.IsReadSpecified = true;