Не удается получить вложения из EWS для перенаправленных писем в надстройке Outlook в настольной версии Outlook 2016

У меня проблема с идентификаторами вложений в пересылаемых письмах / письмах в потоке.

При получении вложений из "исходного / исходного" сообщения электронной почты (как встроенных, так и обычных вложений) я могу успешно получить содержимое вложения из веб-службы EWS, запросив идентификатор вложения у Office.context.mailbox.item.attachments

Когда я пытаюсь получить те же вложения из перенаправленной версии электронного письма, я получаю «Указанный идентификатор вложения недействителен.ErrorInvalidAttachmentId0» для каждого вложения в электронном письме. Если я пересылаю электронное письмо и добавляю к нему дополнительное вложение перед отправкой, я получаю содержимое вложения только для «дополнительного» вложения, а не для каких-либо исходных вложений.

Ошибка возникает только в настольном клиенте Outlook. (версия 16.0.6366.2062). Проблема не существует в OWA при использовании Chrome или Internet Explorer.

Это код, который мой API использует для вызова EWS.

string getAttachmentRequest =
    @"<?xml version=""1.0"" encoding=""utf-8""?>
    <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
    xmlns:xsd=""http://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=""{0}""/>
            </AttachmentIds>
        </GetAttachment>
        </soap:Body>
    </soap:Envelope>";
getAttachmentRequest = String.Format(getAttachmentRequest, attachmentId);

// Prepare a web request object.
HttpWebRequest webRequest = WebRequest.CreateHttp(ewsUrl);
webRequest.Headers.Add("Authorization", string.Format("Bearer {0}", authToken));
webRequest.PreAuthenticate = true;
webRequest.AllowAutoRedirect = false;
webRequest.Method = "POST";
webRequest.ContentType = "text/xml; charset=utf-8";

// Construct the SOAP message for the GetAttchment operation.
byte[] bodyBytes = System.Text.Encoding.UTF8.GetBytes(getAttachmentRequest);
webRequest.ContentLength = bodyBytes.Length;

Stream requestStream = webRequest.GetRequestStream();
requestStream.Write(bodyBytes, 0, bodyBytes.Length);
requestStream.Close();

// Make the request to the Exchange server and get the response.
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

person Patrik Björklund    schedule 17.02.2016    source источник
comment
Можете ли вы получить их на стороне клиента, используя makeEwsRequestAsync ? Или выполнить запрос GetAttachments EWS с сервера?   -  person lgaud    schedule 17.02.2016
comment
Когда надстройка работает в OWA в Internet Explorer / Chrome, я могу правильно получить все вложения. Когда я запускаю одно и то же надстройку в Outlook 2016 для одного и того же электронного письма, он каким-то образом получает недопустимые идентификаторы вложения. На самом деле я еще не сохранил идентификаторы вложений, сгенерированные браузером, и не сравнил их с теми, которые были сгенерированы внутри ограниченного, то есть в Outlook. Но опять же, не знаю, что бы я сделал с этой информацией. (Попробую использовать клиентскую функцию makeEwsRequestAsync, но мне все равно хотелось бы знать, почему это не сработает)   -  person Patrik Björklund    schedule 17.02.2016
comment
Только что вспомнил, что уже пробовал. Это не разрешено. Обратите внимание, что код на стороне сервера должен обращаться к EWS, напрямую создавая запросы EWS. Вы не можете использовать метод Mailbox.makeEwsRequestAsync для доступа к операции GetAttachment. msdn.microsoft.com/en-us/magazine/dn201750.aspx   -  person Patrik Björklund    schedule 17.02.2016


Ответы (2)


Андрей Саламатов ответил на этот вопрос на yammer:

"Это ошибка в Outlook, связанная с тем, как мы вычисляем идентификатор в этом конкретном сценарии. Временным решением было бы сделать вызов EWS GetItem и таким образом получить идентификатор вложения. Итак, если идентификатор, который вы получили из item.attachments [ i] .id не работает, вы можете откатиться и выполнить вызов EWS "

person Patrik Björklund    schedule 18.02.2016
comment
Это несколько бесполезно, так как это единственное место, где я могу найти ссылку на это и без ссылки на рабочий элемент / ожидаемое решение или более подробное решение относительно того, что подразумевается под откатом и вызовом EWS. - person Denny; 04.11.2019

Я столкнулся с этой же проблемой, когда наши серверы EWS были обновлены до 2016 года, и я ранее загружал прикрепленные электронные письма с помощью Управляемый API EWS в PowerShell через:

# load the email items.
$fiItems = $exchService.FindItems( $Inbox.Id, $email_filter, $ivItemView)  

# create the Attachment properties object
$attachment_PropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet(
        [Microsoft.Exchange.WebServices.Data.ItemSchema]::Attachments)  

# LOAD THE ATTACHMENT AS AN EWS ITEM
$attached_email = $email_from_server.attachments[0]
$attached_email.load($attachment_PropertySet)

Очевидно, с новым сервером EWS параметр $attachment_PropertySet вызывает ошибку, и исправление состоит в том, чтобы просто удалить его, то есть:

$attached_email.load()
person Jthorpe    schedule 16.03.2017