Итак, я использую библиотеку php-ews для подключения к моей учетной записи Exchange E-mail Microsoft Office 365 для чтения электронных писем. Я успешно подключился к нему, и мне удалось получить список писем, которые мне нужны.
Теперь проблема в том, что я не могу получить тело сообщения. Читая документацию о веб-службах Exchange, он говорит, что тело не может быть получено с помощью FindItem (), только с GetItem (), и все в порядке.
Теперь проблема, которую я вижу, следующая: я пробовал все возможные примеры, которые я мог найти об этом, и код не имеет никаких ошибок, он просто говорит: «Клиент Soap возвратил статус 404».
Если кто-нибудь знает, где искать решение, скажите, пожалуйста.
РЕДАКТИРОВАТЬ:
$ews = new Client('outlook.office365.com/EWS/OData/Me/Inbox/Messages', '###', '###', ClientEWS::VERSION_2010_SP2); $request = new FindItemType(); $request->ItemShape = new ItemResponseShapeType(); $request->ItemShape->BaseShape = DefaultShapeNamesType::DEFAULT_PROPERTIES; $request->ItemShape->BodyType = BodyTypeResponseType::BEST; $request->Traversal = ItemQueryTraversalType::SHALLOW; $request->ParentFolderIds = new NonEmptyArrayOfBaseFolderIdsType(); $request->ParentFolderIds->DistinguishedFolderId = new DistinguishedFolderIdType(); $request->ParentFolderIds->DistinguishedFolderId->Id = DistinguishedFolderIdNameType::INBOX; // sort order $request->SortOrder = new NonEmptyArrayOfFieldOrdersType(); $request->SortOrder->FieldOrder = array(); $order = new FieldOrderType(); // sorts mails so that oldest appear first // more field uri definitions can be found from types.xsd (look for UnindexedFieldURIType) $order->FieldURI = new PathToUnindexedFieldType(); $order->FieldURI->FieldURI = 'item:DateTimeReceived'; $order->Order = 'Ascending'; $request->SortOrder->FieldOrder[] = $order; try{ //getting list of all emails - works perfectly $result = $ews->FindItem($request); if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success') { $count = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView; $request = new GetItemType(); $request->ItemShape = new ItemResponseShapeType(); $request->ItemShape->BaseShape = DefaultShapeNamesType::ALL_PROPERTIES; for ($i = 0; $i < $count; $i++){ $message_id = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message[$i]->ItemId->Id; $messageItem = new ItemIdType(); $messageItem->Id = $message_id; $request->ItemIds->ItemId[] = $messageItem; } // Here is your response // It throws an error here with the message "Soap client returned status of 404" $response = $ews->GetItem($request); print_r($response); } //print_r($result); } catch(\Exception $e) { echo $e->getMessage(); }
Похоже, вы пытаетесь использовать новую конечную точку REST для Office365
'outlook.office365.com/EWS/OData/Me/Inbox/Messages'
Но ваша попытка сделать и EWS SOAP Request, конечной точкой, которую вы должны использовать для EWS SOAP, является
https://outlook.office365.com/EWS/Exchange.asmx
Возможно, вам стоит рассмотреть возможность использования нового интерфейса REST в качестве альтернативы EWS / SOAP, но тогда вам необходимо использовать REST library.ouauth и т. Д. Согласно https://dev.outlook.com/restapi .
Я бы предложил вам использовать более новую версию этой библиотеки, которая поддерживается гораздо больше и имеет больше возможностей (в этом случае она поддерживает логины OAuth для Office 365), garethp/php-ews
. При его использовании вы можете использовать конечную точку, предоставленную Glen Scales, или просто использовать outlook.office365.com
.