Service Worker能否激活Outlook加载项?代发邮件方案咨询
问题解答
1. 能否通过Service Worker激活加载项发起EWS请求?
不行。Outlook加载项的核心上下文(Office.context)仅在用户主动触发加载项(比如点击按钮、打开任务窗格)时才会初始化,Service Worker作为独立于页面的后台脚本,无法直接激活加载项或获取有效的Office.js运行环境,因此无法调用Office.context.mailbox.makeEwsRequestAsync方法发送EWS请求。
2. 能否使用Microsoft Graph API在Service Worker中发送邮件?
可以,但需要解决权限令牌的核心问题:
- 首先,你的Outlook加载项需要在manifest中声明
Mail.Send权限,并在用户首次交互时完成OAuth授权,获取访问令牌和刷新令牌,将这些令牌存储在IndexedDB或Cache Storage中(Service Worker可直接访问这些存储)。 - 在Service Worker中,读取存储的令牌,若令牌过期则用刷新令牌获取新的访问令牌,之后直接调用Graph API发送邮件。
示例代码(Service Worker中发送Graph请求)
// 假设已从存储中获取到有效的访问令牌 const accessToken = "YOUR_ACCESS_TOKEN"; const emailPayload = { message: { subject: "处理后的邮件主题", body: { contentType: "HTML", content: "<p>这是处理后的邮件正文</p>" }, toRecipients: [ { emailAddress: { address: "recipient@example.com" } } ] }, saveToSentItems: true }; fetch("https://graph.microsoft.com/v1.0/me/sendMail", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json" }, body: JSON.stringify(emailPayload) }) .then(response => { if (!response.ok) throw new Error(`请求失败: ${response.status}`); console.log("邮件发送成功"); }) .catch(error => { console.error("发送邮件出错:", error); });
关键注意事项
- 令牌管理:必须确保Service Worker能获取到有效的访问令牌,提前处理令牌过期的刷新逻辑。
- 权限配置:在加载项manifest中正确声明Graph权限,示例配置如下:
<WebApplicationInfo> <Id>YOUR_APP_ID</Id> <Resource>https://graph.microsoft.com</Resource> <Scopes>Mail.Send</Scopes> </WebApplicationInfo> - CORS:Microsoft Graph API支持跨域请求,Service Worker中发送请求无需额外配置CORS。
内容的提问来源于stack exchange,提问作者hlaliberte
相关产品推荐
相关产品推荐

