#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. Как только это было исправлено, проблема, похоже, исчезла.