Outlook插件开发技术咨询:回调令牌端点与无SSO获取联系人
问题解答
1. Office.context.mailbox.getCallbackTokenAsync() 获取的令牌可调用的端点
通过这个方法获取的是EWS(Exchange Web Services)回调令牌,仅能用于访问与当前Outlook上下文绑定的资源,支持的EWS操作包括:
- 获取当前打开的邮件、日历事件、联系人项的详情(对应EWS的
GetItem操作) - 查询当前邮箱内与上下文项相关的子资源(比如邮件附件、日历与会者,对应
FindItem操作,但查询范围受限,无法全局遍历邮箱所有文件夹) - 修改当前上下文关联的项(比如编辑邮件内容、添加附件,对应
UpdateItem操作)
注意:该令牌不支持调用Microsoft Graph API,权限严格限定在当前插件会话的上下文资源范围内。
2. 无需SSO获取登录用户联系人的方法
存在两种无需依赖SSO的实现方式,均依托Outlook插件上下文:
方式一:用Office.context.mailbox.makeEwsRequestAsync()发送EWS请求
构造EWS的FindItem请求,查询用户的默认联系人文件夹,示例代码如下:
// 构造EWS请求XML,查询默认联系人文件夹的前100个联系人 const ewsRequest = `<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> <soap:Header> <RequestServerVersion Version="Exchange2013" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" soap:mustUnderstand="0"/> </soap:Header> <soap:Body> <FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages" Traversal="Shallow"> <ItemShape> <t:BaseShape>Default</t:BaseShape> <t:AdditionalProperties> <t:FieldURI FieldURI="contacts:EmailAddress1"/> <t:FieldURI FieldURI="contacts:GivenName"/> <t:FieldURI FieldURI="contacts:Surname"/> </t:AdditionalProperties> </ItemShape> <ParentFolderIds> <t:DistinguishedFolderId Id="contacts"/> </ParentFolderIds> <MaxEntriesReturned>100</MaxEntriesReturned> </FindItem> </soap:Body> </soap:Envelope>`; // 发送EWS请求 Office.context.mailbox.makeEwsRequestAsync(ewsRequest, function(result) { if (result.status === "succeeded") { // 解析返回的XML数据,提取联系人信息 const xmlDoc = new DOMParser().parseFromString(result.value, "text/xml"); // 自定义处理逻辑 } else { console.error("EWS请求失败:", result.error); } });
该方法由插件上下文自动处理认证,无需手动获取令牌,可访问用户联系人文件夹内的全量联系人。
方式二:用Office.context.mailbox.getContactsAsync()(仅特定场景可用)
如果插件处于邮件撰写场景,可调用该方法获取用户最近使用的联系人列表,示例代码:
Office.context.mailbox.getContactsAsync({count: 50}, function(result) { if (result.status === "succeeded") { const contacts = result.value; contacts.forEach(contact => { console.log("联系人:", contact.displayName, contact.emailAddress); }); } else { console.error("获取联系人失败:", result.error); } });
注意:该方法仅能获取最近使用的联系人,无法获取联系人文件夹中的全部资源。
内容的提问来源于stack exchange,提问作者MatejDodevski
相关产品推荐
相关产品推荐

