outlook附加图片&文件

时间:2016-09-09 16:06:11

标签: outlook outlook-addin outlook-web-app outlook-web-addins

我试图找到问题的解决方案,但没有发现任何地方,希望有人能救我。

我在VS2015上用JavaScript编写加密项,用于加密和解密正文消息。

1。第一个问题是接收器无法看到的图像。 (通过“插入图片内联”按钮谈论复制到正文中的图像)

撰写模式中,我们对邮件进行加密,然后当我们解密时,它的工作正常,因为撰写模式是客户端,他识别本地图像。 在读取模式中,当用户想要解密消息并查看他无法看到的图像时,因为加密会阻止outlook将本地图像转换为服务器上的数据。

在我的代码中,我采用了这样的正文消息(撰写模式)

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

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

                }))

然后,用户通过点击“发送”定期发送加密消息。

在阅读模式中,我只需将其打印到我的html以检查解密是否良好:

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

然后我得到图片的图标,但没有成功显示真实的图片。 图标的src用于无法访问的地方..

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

如何拍摄此图像标记并执行接收器可以看到图像的内容?我不希望用户需要从我的加载项而不是原始的Outlook上传图像到body。我尝试将图像转换为base-64字符串,但是我在标签中的内容还不够,只需要原始图片,并且成功显示在html中但不能在带有SetAsync函数的消息体中显示..

2。第二个问题是附件。 我使用dropzone插件上传文件(因为outlook不允许访问附件并更改他)。因此,在我上传文件并加密他之后,我使用JS的File API从服务器做出一些新文件:

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

比我想将文件附加到邮件,所以唯一的方法是:

addFileAttachmentAsync(uri, attachmentName, optionsopt, callback opt)

然后,我需要为这个方法创建一个文件的URL,所以我使用这个方法:

var objectURL = URL.createObjectURL(f);

但是现在当我使用addFileAttachmentAsync方法和objectURL时,它写了一个问题并且它无法附加它,我认为URL不正确。

全部谢谢!!

1 个答案:

答案 0 :(得分:4)

对于那些看起来解决这个问题的人来说..

**在Outlook网站中,这个解决方案效果很好但是在Outlook桌面上存在与服务器同步的问题,因此现在没有任何解决方案存在saveAsync功能的延迟,所以它的工作需要但是需要等一下。你可以阅读更多关于here的信息。

第一个问题:

在使用getAsync然后使用setAsync函数时,Outlook加载项存在问题。当身体内有一些图像时会出现问题。之所以发生这种情况,是因为当你以Html格式拍摄身体然后返回身体时会有一些不同的图像仍然没有上传&#39;并且src是错误的。 我成功使用Outlook rest API解决此问题。 所以解决方法是这样的:

  1. 通过getAsync方法获取Html类型的正文消息。创建div 元素并在div中设置返回正文消息。
  2. 要获取消息ID,您需要使用saveAsync函数将消息另存为草稿。
  3. 向Outlook休息请求 您需要获取访问令牌的API,因此请调用getCallbackTokenAsync函数并保存访问权限 令牌。
  4. 使用Http Request来查看rest API以获取所有附件 消息。
  5. 找到您图像的正确ID,并将图像src替换为 您从请求到Outlook休息的图像的base-64 API。
  6. 最后,您可以使用SetAsync功能设置新的身体。
  7. 代码:

    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......
    
      }
      }}}})})};
    

    第二个问题

    addFileAttachmentAsync的问题是,这仅适用于外部服务器上的文件,并且它不会添加blob,本地文件。 所以这里的解决方案也是使用Outlook rest API。该解决方案会将我们的文件附加到邮件中,但我们无法看到这一点 - 邮件中没有预览附件,但是当我们发送邮件时,这将附加到邮件中,我们可以在邮件中看到附件在那里。 该解决方案非常类似于正文中的图像 - 将消息保存为草稿,获取访问令牌,这次Http请求将是&#39; POST&#39;请求我们的消息ID将我们的文件附加到当前消息。

    向消息添加附件的请求的代码(一直到这里与问题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);
                        }};                                                             
    

    希望它会帮助别人,祝你好运!

相关问题