gr3*_*r7h 4 outlook exchangewebservices outlook-restapi office-js outlook-web-addins
这个问题基于我之前提出的一个问题,但后来有了更多细节和经验.
首先是一些背景,我有一个Outlook Addin应该转发用户消息,然后将消息移动到特定文件夹.这需要在OWA和Outlook 2016环境中适用于Prem Exchange.它既适用于以前的客户端,也适用于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': 'user@outlook.com' }}
]
})
}).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
);
}
}
Run Code Online (Sandbox Code Playgroud)
在我之前的问题中,我被告知要检查返回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的情况下.在本文之后,在OfficeJS的帮助下与Rest API进行交互,使用On Prem用户无法通过OfficeJS获取访问令牌,Office.context.mailbox.getCallbackTokenAsync({isRest: true}, function(result){ ... });因此无法使用Rest API.
作为我原来的问题建议中的评论,我会使用EWS.然而,这带来了移动设备的另一个问题.在本文中,移动设备不支持EWS,必须使用Rest.我确实理解一个on Prem用户将无法使用Outlook移动应用程序.
问题出现了,我找不到一种方法来确定使用什么API以及在什么上下文中.如果我关闭,Office.context.mailbox.restUrl那么OWA中的On Prem和O365用户将正确使用他们各自的API,并且一切都是独角兽和彩虹.但是,对于Outlook 2016中的On Prem用户,它将尝试在应该使用EWS时使用Rest API.最后,如果我完全依赖EWS,则Addin将不适用于Outlook移动客户端中的O365用户.
经过一个月的试验,错误以及在海上游泳(我称之为Microsoft文档)后,我有点不知所措.任何帮助将不胜感激
是的,这是一个已知的问题restUrl,来自文档:
注意:连接到具有自定义REST URL的Exchange 2016的本地安装的Outlook客户端将返回无效值
restUrl.
据我所知,这让它变得有点复杂.我会说在目前的情况下,这是我打电话的方式:
restUrl.如果未定义,则EWS即可.restUrl有值,请尝试getCallbackTokenAsync使用isRest: true.如果没有获得令牌,则回退到EWS.然后我会保存这是用户邮箱中的设置(通过Office.context.roamingSettings),因此在将来运行时,加载项可以跳过此"发现"阶段,并从一开始就使用正确的API.
在一个自私的旁注中,我正在进行一项正在进行的项目,以便在https://docs.microsoft.com/en-us/outlook/add-ins/上修改Outlook加载项文档,所以希望如此将有助于整个"在海里游泳"的感觉.如果你能在推特上与我联系我会非常感激的话,我很乐意收到你的反馈意见.
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |