soap — PHP-EWS: установить флаг IsRead для сообщения

Я пишу php-скрипт для чтения электронных писем с Exchange Server 2010. В настоящее время я могу получить все непрочитанные электронные письма, но я хотел бы пометить электронные письма, которые я получил, как прочитанные, поэтому я не получаю сообщения, которые у меня есть уже восстановлен снова. я использую PHP-овость из Github. Я создал скрипт для этого, но каждый раз, когда он запускается, я получаю эту ошибку при вызове UpdateItem.

    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 EWS SOAP ссылка для функции 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

Решение

После некоторого исследования я нашел комментарий, который обеспечил решение Howtoforge Post о подключении к EWS через PHP SOAPclient. Решение состояло в том, чтобы заменить элемент пути элементами FieldURI в types.xsd файл.

Оригинальный тег 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, например

$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->IsReadSpecified = true;
$field->Message->IsRead = true;

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

$request->ItemChanges[] = $change;

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

Также вы можете посмотреть, какой запрос SOAP представляет ваш код на сервер, и опубликовать его. Как правило, из SOAP намного яснее, что вы делаете неправильно.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector