2016-10-27 4 views
2

Итак, я использую библиотеку php-ews для подключения к моей учетной записи электронной почты Microsoft Office 365 Exchange для чтения электронных писем. Я успешно подключился к нему, и мне удалось получить список писем, которые мне нужны.PHP-EWS «Клиент Soap возвратил статус 404»

Теперь проблема в том, что я не могу получить тело сообщения. Читая документацию о веб-службах Exchange, он говорит, что тело не может быть получено с помощью FindItem(), только с GetItem(), и все в порядке.

Теперь проблема, которую я вижу, следующая: Я пробовал все возможные примеры, которые я мог найти об этом, и в коде нет никаких ошибок, он просто говорит: «Мыльный клиент возвратил статус 404».

Если кто-нибудь знает, где искать решение, скажите, пожалуйста.

EDIT:

$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(); 
    } 
+0

Пожалуйста, поделитесь некоторым кодом, чтобы люди могли видеть, что вы сделали до сих пор, и, возможно, найти, где проблема. –

+0

@ jérôme Я добавил свой код, который я использую, есть несколько комментариев, чтобы вы могли видеть, что я делаю. – Imaginaroom

ответ

3

Похоже, вы пытаетесь использовать новую 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.

+0

Большое вам спасибо, вы просто спасли мой день. – Imaginaroom

2

Я предлагаю вам использовать более новую версию этой библиотеки, которая поддерживается намного больше и имеет больше возможностей (в этом случае она поддерживает логины OAuth для Office 365), garethp/php-ews. При его использовании вы можете использовать конечную точку, предоставленную Glen Scales, или просто использовать outlook.office365.com.