EWS 呼叫无法检索电子邮件,但仅适用于特定电子邮件


EWS call failing to retrieve an email, but only for a specific email

发现问题:部分响应(消息正文(包含"" 这是一个无效的 XML 字符。知道如何删除它吗?

我正在使用 Exchange Web 服务从收件箱中提取大量电子邮件。它适用于前 1141 封电子邮件,但在 1142 上失败(跳到 1143 可以正常工作(。我不知道为什么无法检索电子邮件,但是我得到的错误是这样的:

Uncaught SoapFault exception: [Client] looks like we got no XML document 

我将响应 XML 输出到 1142 和 1143 的文件,唯一的区别是 ItemId 行(如预期的那样(。

电子邮件确实存在于收件箱中,尽管它包含一些奇怪的字符(由那些奇怪的方形符号表示(。

我正在使用略微修改的 php-ews 库版本。这是我代码的一部分:

<?php
$response = $ews->FindItem($Request);
$items = $response->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message;
foreach ( $items as $item ) {
    $ItemRequest = new EWSType_FindItemType();
    $ItemRequest->ItemShape = new EWSType_ItemResponseShapeType();
    $ItemRequest->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;
    $ItemRequest->ItemShape->BodyType = EWSType_BodyTypeResponseType::TEXT;
    $ItemRequest->ItemShape->BodyTypeSpecified = true;
    $ItemRequest->ItemIds = new EWSType_NonEmptyArrayOfBaseItemIdsType();
    $ItemRequest->ItemIds->ItemId = new EWSType_ItemIdType();
    $ItemRequest->ItemIds->ItemId->Id = $item->ItemId->Id;
    $response = $ews->GetItem( $ItemRequest ); // Code fails here
}

所以我不知道为什么请求会失败。我尝试添加选项"异常"=> 0,"跟踪"=> 1,我可以看到__last_response确实包含我预期的响应。为什么即使我得到了正确的回应,它仍然神秘地失败了?

我通过扩展我的 SoapClient 类并实现一个从 XML 消息中清除无效字符的__doRequest方法来解决此问题。