0

J'essaie de trouver une solution à mes problèmes mais je n'ai trouvé aucun endroit, j'espère que quelqu'un ici peut me sauver. J'écris un add-in en JavaScript sur VS2015 qui crypte et décrypte les messages du corps.outlook add-in image & fichiers

1. Le premier problème concerne les images que le récepteur ne peut pas voir. (Parler des images qui copie dans le corps par le bouton « inline insert image »)

En Compose Mode nous encrypte le message et puis quand nous décrypté c'est fonctionne bien parce que le mode de composition est un côté client et il il reconnaît les images locales. Dans lire le mode lorsque l'utilisateur veut déchiffrer le message et de voir les images qu'il ne pouvait pas voir car le cryptage empêche la perspective de convertir l'image locale en données sur le serveur.

Dans mon code je prends le corps du message comme celui-ci (composer le mode)

item.body.getAsync(
         item.body.getAsync(
            "html", 
            { asyncContext: "This is passed to the callback" }, 
            function callback(resultbody) { 

            ......Here we send the body for ENCRYPT. 

       })) 

alors, l'utilisateur envoie le message encrypte en cliquant sur 'envoyer' régulière.

En mode de lecture imprimer simplement à mon html pour vérifier si le bien est décrypté:

(JSON.parse(xhr.responseText).Data.Content)); 

puis-je obtenir l'icône de l'image, mais pas le succès pour montrer l'image réelle. Le src de l'icône va pour lieu que l'accès ne lui ..

<img src="https://attachment.outlook.office.net/owa/*****/service.svc/s/GetFileAttachment?id=AAMkADUwMDE0YWM1LTYwODctNG ...... 

Comment puis-je prendre cette balise d'image et de faire quelque chose que le récepteur peut voir l'image? Je ne veux pas que cet utilisateur doive télécharger l'image vers le corps à partir de mon complément au lieu de la perspective d'origine. J'essaie de convertir l'image en base 64, mais avec ce que j'ai dans la balise ça ne suffit pas, juste avec l'image originale et aussi le succès à montrer en html mais pas dans le corps du message avec la fonction SetAsync.

2. Le deuxième problème concerne les pièces jointes. Je télécharge des fichiers avec un plug-in dropzone (parce que outlook ne donne pas accès pour prendre des pièces jointes et le changer). Donc, après que je télécharger des fichiers et encrypte lui, je fais un nouveau fichier avec la réponse du serveur avec l'API File de JS:

ar f = new File([""], "filename.txt", {type: "text/plain", lastModified: date}) . .. . 

que je veux joindre le fichier à la messagerie, de sorte que la seule méthode que faire est :

addFileAttachmentAsync(uri, attachmentName, optionsopt, callback opt) 

, je dois créer un URL pour le fichier pour cette méthode donc j'utiliser cette méthode:

var objectURL = URL.createObjectURL(f); 

Mais maintenant, quand j'utilise la méthode addFileAttachmentAsync avec objectURL il est écrit que il y a un problème et il ne peut pas l'attacher, je pense que l'URL est incorrecte.

Merci à tous !!

Répondre

1

Pour tous ceux qui cherchent une solution à ces problèmes ..

** Dans Outlook Web, cette solution fonctionne bien, mais dans Outlook Desktop, il y a un problème de synchronisation avec le serveur, donc il y a un délai avec la fonction saveAsync sans aucune solution, donc ça marche, mais attendez un peu. bit.You pourrait en lire plus à ce sujet here.

Première question:

Il y a un problème dans add-in perspectives lors de l'utilisation getAsync et fonctions setAsync. Le problème se produit lorsqu'il y a une image dans le corps. Cela arrive parce que lorsque vous prenez le corps au format Html et que vous retournez le corps avec des images différentes, l'image n'est toujours pas "uploadée" et le src est faux. J'ai réussi à contourner ce problème en utilisant l'API de repos Outlook. donc la solution de contournement va comme ceci:

  1. Obtenez le corps du message dans le type de Html par la méthode getAsync. créer div élément et définir le message de corps de retour à l'intérieur de la div.
  2. Pour obtenir l'ID de message, vous devez enregistrer votre message en tant que brouillon avec la fonction saveAsync.
  3. Pour faire une demande à Outlook reste API vous devez obtenir le jeton d'accès, appelez donc à la fonction getCallbackTokenAsync et enregistrez le jeton d'accès.
  4. Effectuez une requête Http vers Outlook API de repos pour obtenir toutes les pièces jointes existant dans le message.
  5. Trouvez le bon ID de votre image et remplacez l'image src à la base-64 de l'image que vous obtenez à partir de votre demande à Outlook reste API.
  6. Enfin, vous pouvez définir votre nouveau corps avec la fonction SetAsync.

code:

item.body.getAsync(
Office.CoercionType.Html, 
{ asyncContext: "This is passed to the callback" }, 
function callback(resultbody) { 
    var bodyDiv = document.createElement('div'); 
    bodyDiv.innerHTML = content; 
    Office.context.mailbox.item.saveAsync(
    function callback(result) { 
    var myNewItemSaved = result.value;                        
    Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, 
    function (result) { 
     if (result.status === "succeeded") { 
      var accessToken = result.value; 
      var itemId = ""; 
      if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS') 
      itemId = Office.context.mailbox.item.itemId; 
      else  
      itemId = Office.context.mailbox.convertToRestId(myNewItemSaved, 
        Office.MailboxEnums.RestVersion.v2_0); 

     var xhr3 = new XMLHttpRequest(); 
     xhr3.open("GET", "https://outlook.office.com/api/v2.0/me/messages/" + itemId + "/attachments", true); 
     xhr3.setRequestHeader("Content-type", "application/json"); 
     xhr3.setRequestHeader("Access-Control-Allow-Origin", "*"); 
     xhr3.setRequestHeader("Authorization", "Bearer " + accessToken); 
     xhr3.send(); 
     xhr3.onreadystatechange = function() { 
     if (xhr3.readyState == 4) { 
     if (xhr3.status == 200) { 
      var allImages = JSON.parse(xhr3.response).value; 
      var isDesktop = false; 
      var imgSrcId = bodyDiv.getElementsByTagName('img')[0].getAttribute("src"); 
      if (imgSrcId.indexOf("cid") != -1) //Outlook Desktop 
        isDesktop = true; 
      for (var i = 0; i < allImages.length; i++) { 
       if (bodyDiv.getElementsByTagName('img')[i].getAttribute("src").indexOf("base64")!=-1) 
        continue; 
      if (isDesktop) 
      imgSrcId = bodyDiv.getElementsByTagName('img')[i].getAttribute("src"); 
      else 
       imgSrcId = bodyDiv.getElementsByTagName('img'[i].getAttribute("originalsrc");                             

      imgSrcId = imgSrcId.substr(4, imgSrcId.length); 

      var wantedImg; 
      for (var j = 0; j < allImages.length; j++) { 
      if ((allImages[j].ContentId).localeCompare(imgSrcId) != -1) { 
          wantedImg = allImages[j]; break;} 
      } 
     bodyDiv.getElementsByTagName('img')[i].src = 'data:' + wantedImg.ContentType + ';base64,' + wantedImg.ContentBytes; 
     } 
    } 
    setAsync...... 

    } 
    }}}})})}; 

Deuxième question

Le problème avec addFileAttachmentAsync que ce travail est uniquement avec des fichiers qui se trouve sur un serveur externe, et il ajoute pas un blob, des fichiers locaux. Donc, ici aussi, la solution est avec Outlook rest API. La solution va attacher notre fichier au message, mais nous ne pouvons pas voir ceci - pas d'aperçu de la pièce jointe dans le message, mais quand nous l'envoyons cela sera joint au message, et nous pourrions voir dans notre message que la pièce jointe est là. La solution est vraiment similaire à celle de l'image dans le corps - Enregistrer le message comme brouillon, obtenir un jeton d'accès et cette fois la requête Http sera une demande POST à ​​notre identifiant de message pour attacher notre fichier au message courant.

code à la demande d'ajouter pièce jointe à un message (tout le chemin jusqu'à ici est la même question comme 1):

var attachment ={ 
    "@odata.type": "#Microsoft.OutlookServices.FileAttachment", 
     "Name": "smile.png", 
     "ContentBytes": "AAACFAMxLjAeKUDndY7EKF4P7QiWE7HgHLa7UiropGUTiDp5V07M0c5jaaTteauhzs0hOU+EOmVT0Lb6eSQ2MzgkCre/zCV9+kIB9PjWnOzoufau67J9PQdXapsOQSMcpt9X2QpcIjnl7H3sLu9iu2rqcvSjwhDnK6JygtghUB405EZHZ9LQcfJ1ZTYHylke2T9zbViq2BPqU/8IHZWsb/KQ/qzV4Jwv3NHnI583JvOuAtETJngh964edC4cU2IY6FkIWprksRw7d4fEQ/+3KbEyW0trIZm59jpTSV01/PhOI0RDKj1xI1Vr+lgMRZpOrYDfChWWWbByNzSXbIsTjHMU6GmQ5Cb09H3kv/2koFa5Pj2z8i+NGywYKw8ZSu3NVblM9I0EkQVLrxkM8gqyrDEtAobxPRxEzGTEXdnjws5UIiiGFBq3khuxejFGCNvUbmPM9guVZO0ccDe1FICTFHkrPlLZW/TvJYMou0HBrvH7s4taBHyZw5x03dhps+WG19D5na44vaVX2Vni6ZrrxfqFo7JTUpCJxCcPyoG7/nEWtJ/V/J+oXdypeapN9Agl6Q81WvCbzuyZgbLTfj6NXWDoliie069Hvk/k2lP+HyO7Iu5ffeRX2WWguwdfGXiNbqInrxn18tX+N7/KqWbRJv96tmijdCmCvsF9Lpr9k7QFKB93wuHfTuE6Qi2IVNBfzNBaz1iJYjY=" 
    } 
    var xhr4 = new XMLHttpRequest();    
    xhr4.open("POST", "https://outlook.office.com/api/v2.0/me/messages/" + itemId + "/attachments", true); 
    xhr4.setRequestHeader("Content-type", "application/json"); 
    xhr4.setRequestHeader("Access-Control-Allow-Origin", "*"); 
    xhr4.setRequestHeader("Authorization", "Bearer " + accessToken); 
    xhr4.send(JSON.stringify(attachment)); 
    xhr4.onreadystatechange = function() {                          
        if (xhr4.readyState == 4) { 
        if (xhr4.status == 200) 
          console.log("ok"); 
        else 
          console.log(xhr4.response); 
        }};                

espère qu'il va aider quelqu'un, bonne chance!