PHP-EWS “Soap client returned status of 404”

2019-05-26 23:46发布

So, I'm using php-ews library to connect to my Microsoft Office 365 Exchange Email account to read emails. I've connected successfully to it and I have managed to retrieve a list of emails that I need.

Now the problem is that I cannot get message body. Reading documentation about Exchange Web Services it says that body cannot be fetched with FindItem(), only with GetItem(), and that's okay.

Now the problem I'm seeing is following: I tried all possible examples I could find about this, and the code doesn't have any errors, it just says "Soap client returned status of 404".

If anyone has any idea where to look for the solution, please tell me.

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

2条回答
趁早两清
2楼-- · 2019-05-27 00:19

I'd suggest you use a newer version of this library that's maintained much more and has more features (In this case, it support OAuth logins for Office 365), garethp/php-ews. When using it, you can either use the endpoint provided by Glen Scales, or just use outlook.office365.com.

查看更多
The star\"
3楼-- · 2019-05-27 00:26

It looks like your trying to use the new REST endpoint for Office365

'outlook.office365.com/EWS/OData/Me/Inbox/Messages'

But your trying to make and EWS SOAP Request, the endpoint you should be using for EWS SOAP is

https://outlook.office365.com/EWS/Exchange.asmx

You might want to consider using the new REST interface as an alternative to EWS/SOAP but you then need to use a REST library.ouauth etc as per https://dev.outlook.com/restapi.

查看更多
登录 后发表回答