Извлечение вложений электронной почты из outlook.com почтовый ящик через EWS с использованием PHP

#php #laravel #soap #exchangewebservices #outlook-web-addins

#php #laravel #soap #exchangewebservices #outlook-веб-дополнения

Вопрос:

Я разрабатываю надстройку Outlook, которая должна синхронизировать электронную почту с другим сервером для нашего варианта использования. Я смог получить почту, сохраненную в удаленной базе данных, но проблема заключается в извлечении вложений. Поскольку надстройка сама не может отправить вложение, я должен отправить удаленному серверу некоторые детали, такие как (URL ews, токен доступа, идентификатор вложения и т.д.), Чтобы он мог использовать эту информацию для связи с сервером Outlook для получения соответствующих вложений. Как бы я ни пытался, похоже, это не удается. Это в основном заставляет меня думать, что делает outlook.com поддерживает EWS? Правильные ссылки трудно найти, но некоторые из этих ссылок говорят «Нет». Но я верю, что с тех пор outlook.com похоже, что это часть «Exchange Online» (хотя и бесплатная), тогда она также должна поддерживать EWS. Это видно из того факта, что я могу извлечь ewsUrl и attachmentToken, выполнив метод getCallbackTokenAsync () объекта Office.context.mailbox через мою надстройку outlook. В документации надстройки говорится:

«Объект Office.context.mailbox предоставляет функцию getCallbackTokenAsync для получения токена, который удаленный сервер может использовать для аутентификации на сервере Exchange».

Итак, вот оно. Но когда я пытаюсь выполнить запрос SOAP к ewsUrl с полезной нагрузкой XML (с моего удаленного сервера), конечная точка сервера outlook (https://outlook.office365.com/EWS/Exchange.asmx ) продолжает возвращать ошибку 500 — внутренняя ошибка сервера. В ответе также не так много убедительных подробностей, поэтому я могу отследить, есть ли что-то неправильное в запросе, который я отправляю ему. Я действительно озадачен этим. Ценю некоторую помощь от кого-нибудь, кто это уже делал. Ниже приведен блок кода (Laravel) Я выполняю для вашей справки:

         // check for attachments
        if(is_object($incoming->attachments))
        {
            // we have attachments
            $attachments = $incoming->attachments->attachments;
            $ewsToken = $incoming->attachments->attachmentToken;
            $ewsUrl = $incoming->attachments->ewsUrl;

            foreach($attachments as $k => $v){

                Log::info('Attachment ID: '.$v->id);

                $attachmentSoapRequest = <<<EOD
@"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""https://www.w3.org/2001/XMLSchema-instance""
xmlns:xsd=""https://www.w3.org/2001/XMLSchema""
xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""
xmlns:t=""http://schemas.microsoft.com/exchange/services/2006/types"">
<soap:Header>
<t:RequestServerVersion Version=""Exchange2013"" />
</soap:Header>
    <soap:Body>
    <GetAttachment xmlns=""http://schemas.microsoft.com/exchange/services/2006/messages""
    xmlns:t=""http://schemas.microsoft.com/exchange/services/2006/types"">
        <AttachmentShape/>
        <AttachmentIds>
        <t:AttachmentId Id=""$v->id""/>
        </AttachmentIds>
    </GetAttachment>
    </soap:Body>
</soap:Envelope>"
EOD;
                try{

                    $response = Http::withBody($attachmentSoapRequest, 'text/xml')->withToken($ewsToken)->withOptions([
                        'debug' => true,
                        'allow_redirects' => false
                    ])->post($ewsUrl);
                    
                    // process response
                    if ($response->successful()) {
                
                        Log::info('received ews response!');
                        $responseEnvelope = $response->body();
                        Log::info($responseEnvelope);
                
                    } else {
                
                        $response->throw();
                
                    }
                } catch (RequestException $e) {
                    Log::info('ews request error!');
                    Log::info($e->getMessage());
                }

                Log::info(print_r($response, true));

            }
        }
  

Если кто-то знает ответ, он не обязательно должен быть специфичным для Laravel. Приветствуется даже решение на чистом PHP.

Спасибо.

Комментарии:

1. Пожалуйста, ваш полный ответ на EWS? Я предполагаю, что вы прочитали эту документацию и, следуя ей, пишете свой код на другом языке программирования.

2. Спасибо за ответ. Однако я выяснил, что проблема на самом деле заключалась в ошибочной схеме XML. Как только это было исправлено, проблема, похоже, исчезла.