1

J'ai un problème avec les pièces jointes identifiant des pièces jointes dans les courriels/e-mails transférés dans un fil.Impossible d'obtenir des pièces jointes d'EWS pour les courriers électroniques envoyés dans un addin Outlook dans la version de bureau d'Outlook 2016

Lors de l'extraction des pièces jointes de l'e-mail « source/original » (à la fois en ligne et les pièces jointes normales) je peux récupérer avec succès le contenu de la pièce jointe à partir du serveur Web intégré webservice en demandant id d'attachement de de Office.context.mailbox.item.attachments

Lorsque je tente de obtenir les mêmes pièces jointes à partir d'une version fowarded de l'email que je reçois "L'ID de pièce jointe spécifié est invalide.ErrorInvalidAttachmentId0" pour chaque pièce jointe dans l'e-mail. Si je transfère un e-mail et ajoute une pièce jointe à l'e-mail avant de l'envoyer, j'obtiens le contenu de la pièce jointe uniquement pour la pièce jointe "supplémentaire", et non pour les pièces jointes d'origine.

L'erreur se produit uniquement avec le client de bureau Outlook. (version 16.0.6366.2062). Le problème n'existe pas dans OWA lorsque vous utilisez Chrome ou Internet Explorer.

Ceci est le code que mon API utilise pour appeler 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(); 
+0

Pouvez-vous les obtenir côté client à l'aide [makeEwsRequestAsync] (https: //dev.outlook.com/reference/add-ins/Office.context.mailbox.html#makeEwsRequestAsync)? Ou faire une demande GetAttachments EWS à partir du serveur? – lgaud

+0

Lorsque l'addin est en cours d'exécution dans OWA dans Internet Explorer/Chrome, je peux obtenir toutes les pièces jointes correctement. Lorsque j'exécute exactement le même addin dans Outlook 2016, par rapport au même courrier électronique, il obtient en quelque sorte des identifiants de pièce jointe non valides. En fait, je n'ai pas encore enregistré les identifiants de pièces jointes générés par le navigateur et les ai comparés à ceux générés à l'intérieur de la vue restreinte, c'est-à-dire dans Outlook. Mais encore une fois, je ne sais pas ce que je ferais avec cette information. (Essayera avec la fonction makeEwsRequestAsync de clientide, mais j'aimerais toujours savoir pourquoi cela ne fonctionnera pas) –

+0

Je me suis juste rappelé que j'ai déjà essayé. Ce n'est pas autorisé. "Notez que le code côté serveur doit accéder à EWS en créant directement des demandes EWS Vous ne pouvez pas utiliser la méthode Mailbox.makeEwsRequestAsync pour accéder à l'opération GetAttachment." https://msdn.microsoft.com/en-us/magazine/dn201750.aspx –

Répondre

2

Andrew Salamatov a répondu à cette question sur Yammer:

« Il est un bug que nous avons dans Outlook avec la façon dont on calcule l'identifiant dans ce scénario spécifique La solution serait de faire un appel EWS GetItem. Donc, si l'ID que vous avez obtenu à partir de item.attachments [i] .id ne fonctionne pas, vous pouvez vous replier et faire un appel EWS "

1

Je suis tombé sur ce même problème lorsque notre EWS les serveurs ont été mis à niveau vers 2016, et je téléchargeais précédemment des e-mails joints en utilisant le EWS Managed API dans PowerShell via:

# 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) 

Apparemment, avec le nouveau serveur EWS le paramètre $attachment_PropertySet provoque une erreur, et le correctif est tout simplement de l'enlever, à savoir:

$attached_email.load()