Outlook 2016中ItemChanged事件未触发问题技术问询
解决Outlook 2016加载项固定60分钟后ItemChanged事件失效问题
我来帮你梳理下这个问题的排查和解决思路——你遇到的场景是Outlook 2016(版本16.0.9226.2114)里固定的加载项,在运行约60分钟后ItemChanged事件突然不触发了,而且当前Item还停留在之前打开的旧邮件上下文里,同时控制台抛出SEC7120: Origin https://staging-addinsf.smartcloudconnect.io not found in Access-Control-Origin header的CORS错误,还怀疑是outlook-win32-16.02.js更新导致的回归,结合这些信息,给你几个实用的方向:
1. 先搞定CORS错误——这很可能是根源
这个SEC7120错误是浏览器同源策略在搞事情,会直接导致加载项没法和Outlook宿主或者你的后端同步上下文数据,很大概率是后续ItemChanged失效的导火索:
- 检查你加载项后端服务的
Access-Control-Allow-Origin响应头,一定要把https://outlook.office.com(Outlook桌面版的宿主源)和你的加载项域名https://staging-addinsf.smartcloudconnect.io都加进去; - 别图省事用通配符
*,Outlook桌面版的WebView控件对通配符兼容性不太好,显式列出允许的Origin更稳妥; - 留意加载项启动初期和60分钟后的请求Origin有没有变化——比如Outlook会话超时后可能换了内部请求源,你可以在后端日志里追踪下请求的Origin头。
2. 给ItemChanged加个兜底的上下文重置逻辑
就算CORS问题解决了,考虑到你怀疑是Office.js的回归,咱们可以做些兜底逻辑来避免上下文滞留:
- 监听加载项的
VisibilityChanged事件,当加载项从后台切回前台时,主动调用Office.context.mailbox.item.getSelectedItemsAsync()或者Office.context.mailbox.item.loadAsync()来刷新当前上下文; - 提前在50分钟左右(比60分钟的触发时间早一点),主动触发一次上下文刷新,防止会话过期导致事件绑定失效;
- 再检查下
ItemChanged的绑定方式,确保是在加载项初始化时正确绑定,没被意外解绑:// 正确的事件绑定示例,记得加主动刷新逻辑 Office.initialize = function () { Office.context.mailbox.addHandlerAsync(Office.EventType.ItemChanged, onItemChanged); }; function onItemChanged(eventArgs) { // 切换邮件后主动刷新上下文,避免旧数据残留 Office.context.mailbox.item.loadAsync(["subject", "body"], function(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { // 这里更新你的UI或业务逻辑 } }); }
3. 锁定Office.js版本验证回归问题
你怀疑是outlook-win32-16.02.js的更新搞的鬼,可以试试锁定Office.js版本来验证:
- 把加载项里动态加载Office.js的代码改成指定1.1版本的固定引用,观察60分钟后问题还会不会复现;
- 也可以查下微软Office加载项的官方更新日志,看看近期
outlook-win32-16.02.js有没有关于事件绑定或上下文管理的变更。
4. 排查Outlook会话超时的影响
Outlook桌面版的加载项可能有60分钟的会话超时机制,会导致事件绑定被回收:
- 去Outlook的信任中心设置里,看看加载项的会话超时时间配置;
- 在加载项里整个心跳机制,每隔一段时间发个轻量请求(比如调用
Office.context.mailbox.getUserIdentityTokenAsync()),保持会话活跃,别让宿主把事件绑定给收走了。
内容的提问来源于stack exchange,提问作者Sviatoslav Lobach
相关产品推荐
相关产品推荐

