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

相關問題