PHP-EWS:为消息设置IsRead标志
我正在编写一个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;
}
经过一番研究,我发现一条评论提供了关于通过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元素替换它的所有实例。之后,我做了这个,我能够将邮件标记为已读,而无需修改我在我的问题中使用的代码
两件事情,也许这样做首先你应该在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更清楚你所做的不正确。
我尝试使用SoapClient的__getLastRequest()和__getLastResponse()从服务器转储发送和接收的XML。 '功能。但是,即使发送请求,我的代码仍然失败。我会用堆栈跟踪来更新我的问题,它显示了我最初忽略的内容。 – linuxjedi