Веб-службы PHP и Exchange: выборка тела сообщения с использованием php-ews

Мне не повезло получить тело сообщения электронной почты с сервера Exchange 2010 с помощью php-ews. Это мой код:

$ews = new ExchangeWebServices("hostname", "username","password",ExchangeWebServices::VERSION_2010); $request = new EWSType_FindItemType(); $itemProperties = new EWSType_ItemResponseShapeType(); $itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES; $itemProperties->BodyType = EWSType_BodyTypeResponseType::BEST; $request->ItemShape = $itemProperties; //If I do not include the below three sentences I get a PHP Fatal error saying "Basepoint" not found $request->IndexedPageItemView = new EWSType_IndexedPageViewType(); $request->IndexedPageItemView->BasePoint = 'Beginning'; $request->IndexedPageItemView->Offset = 0; $request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType(); $request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType(); $request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX; $request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW; $result = new EWSType_FindItemResponseMessageType(); $result = $ews->FindItem($request); if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success'){ $message = $result->ResponseMessages->FindItemResponseMessage->Items->Message; //This if loop is entered but the $message variable contains nothing print_r($message);exit; //var_dump($message) displays NULL } 

Цикл «if» вводится, однако переменная $ message не содержит ничего. Обычно это должен быть объект, из которого я могу получить тело письма.

Что я делаю не так ?

Я попробовал это внутри оператора if (), и я получил объект $ message:

 $message = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message; print_r($message);exit; 

Атрибут «RootFolder» отсутствовал. Однако результирующая переменная $ message не содержит атрибута body, содержащего тело письма. Вот как выглядит print_r ($ message):

 stdClass Object 

([ItemId] => StdClass объекта ([Id] => AAMkADZjOTZhNjNkLTBmZTAtNDdkZi04NGI5LTdiZWY0ZWYzOGNhMwBGAAAAAABI9LX / rIDdRr5XMdDM8RGZBwAL3uOTQAYYQ4U8CTQP / + wKAAAAWsnbAAAL3uOTQAYYQ4U8CTQP / + wKAAAAWvd0AAA = [ChangeKey] => CQAAABYAAAAL3uOTQAYYQ4U8CTQP / + wKAAAAWyCi)

 [ParentFolderId] => stdClass Object ( [Id] => AQMkADZjOTZhNjNkLTBmZTAtNDdkZi04NGI5LTdiZWY0ZWYzOGNhMwAuAAADSPS1/6yA3Ua+VzHQzPERmQEAC97jk0AGGEOFPAk0D//sCgAAAVrJ2wAAAA== [ChangeKey] => AQAAAA== ) [ItemClass] => IPM.Note [Subject] => Test [Sensitivity] => Normal [DateTimeReceived] => 2012-09-05T13:03:08Z [Size] => 4754 [Importance] => Normal [IsSubmitted] => [IsDraft] => [IsFromMe] => [IsResend] => [IsUnmodified] => 1 [DateTimeSent] => 2012-09-05T13:03:00Z [DateTimeCreated] => 2012-09-05T13:03:08Z [DisplayCc] => [DisplayTo] => sara cooper [HasAttachments] => [Culture] => en-IN [EffectiveRights] => stdClass Object ( [CreateAssociated] => [CreateContents] => [CreateHierarchy] => [Delete] => 1 [Modify] => 1 [Read] => 1 ) [LastModifiedName] => Lin T [LastModifiedTime] => 2012-09-05T13:03:08Z [IsAssociated] => [WebClientReadFormQueryString] => ?ae=Item&a=Open&t=IPM.Note&id=RgAAAABI9LX%2frIDdRr5XMdDM8RGZBwAL3uOTQAYYQ4U8CTQP%2f%2bwKAAAAWsnbAAAL3uOTQAYYQ4U8CTQP%2f%2bwKAAAAWvd0AAAJ&exvsurl=1 [ConversationId] => stdClass Object ( [Id] => AAQkADZjOTZhNjNkLTBmZTAtNDdkZi04NGI5LTdiZWY0ZWYzOGNhMwAQAJ56TrE0QUIAk59ALIqWrrY= ) [Sender] => stdClass Object ( [Mailbox] => stdClass Object ( [Name] => Lin T [MailboxType] => OneOff ) ) [IsReadReceiptRequested] => [ConversationIndex] => Í‹fÃIžzN±4AB“Ÿ@,Š–®¶ [ConversationTopic] => Test [From] => stdClass Object ( [Mailbox] => stdClass Object ( [Name] => Lin T [MailboxType] => OneOff ) ) [InternetMessageId] => <027d01cd8b66$c8c967e0$5a5c37a0$@marlabs.com> [IsRead] => [ReceivedBy] => stdClass Object ( [Mailbox] => stdClass Object ( [Name] => sara cooper [MailboxType] => OneOff ) ) [ReceivedRepresenting] => stdClass Object ( [Mailbox] => stdClass Object ( [Name] => sara cooper [MailboxType] => OneOff ) ) 

)

Мне также нужен АДРЕС ЭЛЕКТРОННОЙ ПОЧТЫ отправителя и получателя. Здесь отображаются только имя и фамилия. Пожалуйста, помогите, это очень актуально.

Я, наконец, получил его работу! Вот как вы извлекаете непрочитанные электронные письма с сервера Exchange 2010:

  $ews = new ExchangeWebServices("hostname", "username", "password",ExchangeWebServices::VERSION_2010); $request = new EWSType_FindItemType(); $itemProperties = new EWSType_ItemResponseShapeType(); $itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ID_ONLY; $itemProperties->BodyType = EWSType_BodyTypeResponseType::BEST; $request->ItemShape = $itemProperties; $fieldType = new EWSType_PathToUnindexedFieldType(); $fieldType->FieldURI = 'message:IsRead'; $constant = new EWSType_FieldURIOrConstantType(); $constant->Constant = new EWSType_ConstantValueType(); $constant->Constant->Value = "0"; $IsEqTo = new EWSType_IsEqualToType(); $IsEqTo->FieldURIOrConstant = $constant; $IsEqTo->Path = $fieldType; $request->Restriction = new EWSType_RestrictionType(); $request->Restriction->IsEqualTo = new EWSType_IsEqualToType(); $request->Restriction->IsEqualTo->FieldURI = $fieldType; $request->Restriction->IsEqualTo->FieldURIOrConstant = $constant; $request->IndexedPageItemView = new EWSType_IndexedPageViewType(); $request->IndexedPageItemView->BasePoint = 'Beginning'; $request->IndexedPageItemView->Offset = 0; $request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType(); $request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType(); $request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX; $request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW; $result = new EWSType_FindItemResponseMessageType(); $result = $ews->FindItem($request); /*echo '<pre>'; print_r($result);exit;*/ if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success'){ $count = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView; for ($i = 0; $i < $count; $i++){ $message_id = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message[$i]->ItemId->Id; $request = new EWSType_GetItemType(); $request->ItemShape = new EWSType_ItemResponseShapeType(); $request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES; $request->ItemIds = new EWSType_NonEmptyArrayOfBaseItemIdsType(); $request->ItemIds->ItemId = new EWSType_ItemIdType(); $request->ItemIds->ItemId->Id = $message_id; $response = $ews->GetItem($request); //print_r($response);exit; if( $response->ResponseMessages->GetItemResponseMessage->ResponseCode == 'NoError' && $response->ResponseMessages->GetItemResponseMessage->ResponseClass == 'Success' ) { $message = $response->ResponseMessages->GetItemResponseMessage->Items->Message; //process the message data. } } } 

Вот лучшее решение. Вы не хотите каждый раз вызывать запрос GetItem для сообщения. Это дорого и неэффективно, и получение электронных писем в папках, содержащих тысячи писем, ужасно медленное. Также обратите внимание: если обмен возвращает 1 электронное письмо или несколько писем, некоторые объекты встраиваются в массив, поэтому ваш код должен учитывать его. Этот фрагмент кода вернет несколько тел сообщений электронной почты, если они доступны.

 $ews = new ExchangeWebServices("hostname", "username", "password", ExchangeWebServices::VERSION_2010); $request = new EWSType_FindItemType(); $itemProperties = new EWSType_ItemResponseShapeType(); $itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ID_ONLY; $itemProperties->BodyType = EWSType_BodyTypeResponseType::TEXT; $request->ItemShape = $itemProperties; $request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType(); $request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType(); $request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX; $request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW; $result = new EWSType_FindItemResponseMessageType(); $result = $ews->FindItem($request); if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success') { $count = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView; $request = new EWSType_GetItemType(); $request->ItemShape = new EWSType_ItemResponseShapeType(); $request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES; for ($i = 0; $i < $count; $i++){ $message_id = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message[$i]->ItemId->Id; $messageItem = new \EWSType_ItemIdType(); $messageItem->Id = $message_id; $request->ItemIds->ItemId[] = $messageItem; } // Here is your response $response = $ews->GetItem($request); } 

$message – это объект, содержащий целое сообщение (включая заголовки, например), а не строку с телом сообщения. Чтобы получить объект, содержащий тело сообщения, тип тела сообщения и т. Д., Используйте тело $message->body и если вы просто заинтересованы в печати содержимого тела сообщения, используйте $message->body->_