如何在Outlook插件中调用Graph API读取MIME格式电子邮件
问题1:授权报错13000解决方案
错误13000是身份API不支持,核心原因是外接程序未配置SSO所需的清单参数,或运行环境不兼容SSO,推荐优先用适配性更高的回调令牌方案:
- 调用
Office.context.mailbox.getCallbackTokenAsync时必须传入{isRest: true}参数,拿到的令牌可直接用于Graph接口鉴权,无需配置额外的SSO参数,也不需要调用Office.context.auth.getAccessTokenAsync接口 - 确认外接程序清单中已配置
ReadWriteMailbox权限,才能获取邮件完整内容的访问权限
问题2:邮件ID格式不匹配解决方案
Office.context.mailbox.item.itemId返回的是EWS格式的ID,无法直接用于Graph接口,需要做URL安全的Base64转换,转换规则如下:
- 将ID中的
+替换为-,/替换为_ - 去除末尾所有的
=填充字符 - 转换后的ID即可直接传入Graph接口使用
完整示例代码
// EWS ID转Graph可用ID function ewsIdToGraphId(ewsItemId) { return ewsItemId.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); } // 获取邮件MIME内容 function getEmailMimeContent(callback) { // 获取可访问Graph的回调令牌 Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (tokenResult) { if (tokenResult.status !== Office.AsyncResultStatus.Succeeded) { callback(tokenResult.error, null); return; } const accessToken = tokenResult.value; // 转换邮件ID const graphItemId = ewsIdToGraphId(Office.context.mailbox.item.itemId); // 调用Graph接口获取MIME fetch(`https://graph.microsoft.com/v1.0/me/messages/${graphItemId}/$value`, { headers: { 'Authorization': `Bearer ${accessToken}` } }).then(function (res) { if (!res.ok) throw new Error('接口请求失败'); return res.text(); }).then(function (mimeContent) { callback(null, mimeContent); }).catch(function (err) { callback(err, null); }); }); } // 调用示例 getEmailMimeContent(function (err, mime) { if (err) { console.error('获取失败:', err); return; } // 此处处理获取到的MIME/EML内容 console.log('MIME内容获取成功,长度:', mime.length); });
注意事项
- 该方案无1MB大小限制,支持获取完整的邮件MIME内容
- 不需要处理CORS问题,Graph接口默认允许Outlook外接程序的跨域请求
内容的提问来源于stack exchange,提问作者Dmytro Pastovenskyi
相关产品推荐
相关产品推荐

