PHP-EWS 2010, как установить флаг IsRead

Мне удалось успешно получить непрочитанные электронные письма из почтового ящика Exchange 2010 с помощью API php-ews. Однако после того, как я получил электронные письма, я хочу установить для свойства IsRead электронной почты значение true, чтобы эти сообщения не появлялись при следующем получении электронных писем.

Кто-нибудь делал это раньше?

РЕДАКТИРОВАТЬ :

Вот как я пытаюсь установить флаг 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.

После отладки в течение некоторого времени я пришел к выводу, что ошибка возникает в функции curl_exec в файле NTLMSoapClient.php.

Я не знаю, куда идти дальше. Пожалуйста помоги.


person Lin    schedule 10.09.2012    source источник
comment
Здравствуйте, проблему обнаружил сам. Оказывается, это было из-за версии Exchange, которую я указал при создании объекта ews. Функция updateItem выполняется, но выдает эту ошибку: Объект в описании изменения должен содержать одно и только одно свойство для изменения. Любые идеи ?   -  person Lin    schedule 11.09.2012


Ответы (3)


Я столкнулся с аналогичной проблемой при обновлении события календаря и установке флага 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.

person Paulo Margarido    schedule 17.09.2012

Я перепробовал все, включая 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);
person redknight    schedule 02.10.2012

Ну не знаю как в php, а в C# есть еще одно поле, которое надо установить: IsReadSpecified = true.

email.IsRead = true;
email.IsReadSpecified = true;
person IStar    schedule 14.05.2013