2

这个问题是基于一个previous question我问了一下,但后来有了更多的细节和经验。在Outlook插件中使用EWS与Rest API的持久传奇

首先是一些背景,我有一个Outlook插件,应该转发用户消息,然后将消息移动到特定的文件夹。这需要在Prem Exchange上的OWA和Outlook 2016环境中运行。它也应该适用于以前的客户端以及用于O365用户的Outlook Mobile App。

我的具体问题归结为检测何时使用EWS与Rest API(甚至是MS Graph API)。

这里是我的代码片段:

Office.initialize = function() { 
    $(document).ready(function() { 
     $('#forward').click(forwardMessage); 
    }); 
}; 

function forwardMessage() { 
    if(Office.context.mailbox.restUrl) { // The problem child 
     forwardEWS(); // Works like a charm 
    } else { 
     forwardRest(); // Works fine for O365 users 
    } 
} 

function forwardRest() { 
    var restHost = Office.context.mailbox.restUrl; 
    var restId = getItemRestId(); 

    Office.context.mailbox.getCallbackTokenAsync({isRest: true}, function(result){ 
     if (result.status === "succeeded") { 
      var accessToken = result.value; 

      $.ajax({ 
       url: restHost + '/v2.0/me/messages/' + restId + '/forward', 
       type: 'post', 
       headers: {'Authorization': 'Bearer ' + accessToken}, 
       contentType: 'application/json', 
       data: JSON.stringify({ 
        'ToRecipients': [ 
         {'EmailAddress': { 'Address': '[email protected]' }} 
        ] 
       }) 
      }).done(function (response) { 
       sidepane_status('success', 'Message forwarded.'); 

       moveRest(restHost, accessToken, restId); 

      }).fail(function(err) { 
       sidepane_status('error', 'Could not forward message'); 
      }); 
     } else { 
      sidepane_status('error', 'Could not get token'); 
     } 
    }); 
} 

function moveRest(restHost, accessToken, restId) { 
    var folder = $('#ews_folder').val(); 
    $.ajax({ 
     url: restHost + '/v2.0/me/messages/' + restId + '/move', 
     type: 'post', 
     headers: {'Authorization': 'Bearer ' + accessToken}, 
     contentType: 'application/json', 
     data: JSON.stringify({ 'DestinationId': folder }) 
    }).fail(function(err) { 
     sidepane_status('error', 'Could not move message to ' + folder); 
    }); 
} 

function getItemRestId() { 
    if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS') { 
     return Office.context.mailbox.item.itemId; 
    } else { 
     return Office.context.mailbox.convertToRestId(
      Office.context.mailbox.item.itemId, 
      Office.MailboxEnums.RestVersion.v2_0 
     ); 
    } 
} 

在我刚才的问题,我被告知要检查Office.context.mailbox.restUrl回报。如果它返回一个URL,则可以使用Rest API,如果不使用EWS。这里的问题是我的Prem Exchange用户,在OWA Office.context.mailbox.restUrl返回什么都没有,那么我只是使用EWS。但在Outlook 2016 Office.context.mailbox.restUrl返回https://exch1.mailhost.com/api。这导致一些问题。

第一种情况是Outlook 2016中的On Prem Exchange用户返回Rest URL时。在article之后,在OfficeJS的帮助下与Rest API进行交互,在On Prem User中通过OfficeJS与Office.context.mailbox.getCallbackTokenAsync({isRest: true}, function(result){ ... });获得访问令牌是不可能的,并且当时不能使用Rest API。

我会,作为我原来的问题建议的评论,只是使用EWS。但是,这带来了移动的另一个问题。从此article,移动不支持EWS,必须使用Rest。我明白Prem用户将无法使用Outlook移动应用程序。

问题在于我无法找到一种方法来确定使用什么API以及在什么情况下。如果我键入Office.context.mailbox.restUrl,则OWA中的On Prem和O365用户将正确使用它们各自的API,并且所有内容都是独角兽和彩虹。但是,对于Outlook 2016中的On Prem用户,它将尝试在应使用EWS时使用Rest API。最后,如果我完全依赖EWS,那么Addin将不适用于Outlook移动客户端中的O365用户。

经过一个月的试用,错误和在大海中游泳的微软文档,我有点不知所措。任何帮助将不胜感激

回答

4

没错,这是一个已知的问题restUrl,从docs

注:连接到Exchange 2016的本地安装使用自定义REST URL Outlook客户端配置将返回一个无效值为restUrl

我明白这使得它更复杂一点。我想说,在目前的情况下,我将如何拨打电话:

  • 首先检查restUrl。如果没有定义,那么EWS就是要走的路。
  • 如果restUrl有值,请尝试getCallbackTokenAsyncisRest: true。如果没有得到令牌,则回退到EWS。

,那么我会保存,这是在用户的邮箱的设置(通过Office.context.roamingSettings)等未来运行插件可以跳过这一“发现”阶段,只是使用权API从一开始。

在自助服务方面,我正在进行一个正在进行的项目,以修复Outlook加载项文档https://docs.microsoft.com/en-us/outlook/add-ins/,所以希望这将有助于整个“在海中游泳”的感觉。我很乐意收到你的反馈信息,如果你可以联系我,请致电Twitter,非常感谢。

+0

这绝对看起来好像应该起作用,当我有机会测试它时,它被标记为正确,谢谢。我还会与您联系,向您提供有关文档的一些反馈。 – gr347wh173n0r7h

相关问题