這個問題是基於一個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用戶。
經過一個月的試用,錯誤和在大海中游泳的微軟文檔,我有點不知所措。任何幫助將不勝感激
這絕對看起來好像應該起作用,當我有機會測試它時,它被標記爲正確,謝謝。我還會與您聯繫,向您提供有關文檔的一些反饋。 – gr347wh173n0r7h