Office.Recipients接口getAsync调用返回空而非邮件地址问题
Outlook 外接程序
Office.Recipients.getAsync 读取不到已输入收件人的解决方法 问题表现
- 邮件编辑页to/cc/bcc字段已输入邮件地址,调用
Office.Recipients对应的getAsync方法时返回空数组,无法获取已填写的地址内容。
复现步骤
- 新建邮件,在收件人/抄送/密送输入框中输入目标邮件地址,不执行额外按键操作
- 打开Script Lab的「Compose Message To」示例加载项
- 点击「Get who this is to」按钮触发接口调用,返回结果为空,已输入的收件人未完成解析。
设计逻辑说明
Outlook收件人字段默认采用「用户触发解析」的交互逻辑:
仅当用户按下Tab键、空格键,或输入分号
;确认当前输入的收件人时,客户端才会将输入框内的纯文本校验、解析为标准收件人对象,写入可被外接程序接口读取的收件人集合。
未触发上述确认操作时,输入的内容仅为输入框内的临时文本,不会被getAsync接口识别读取。
规避方案
目前官方未提供getAsync调用时自动强制解析未确认收件人文本的原生API,可通过以下两种方式解决:
- 前置触发解析逻辑
调用getAsync前通过临时转移焦点的方式,模拟用户确认操作触发客户端解析,参考代码:function getRecipients(callback) { Office.context.mailbox.item.to.getAsync((res) => { if (res.status !== Office.AsyncResultStatus.Succeeded) { return callback(res.error); } // 未获取到收件人时,触发失焦强制解析 if (res.value.length === 0) { document.activeElement.blur(); setTimeout(() => { Office.context.mailbox.item.to.getAsync((finalRes) => { callback(null, finalRes.value); }); }, 200); } else { callback(null, res.value); } }); } // 调用示例 getRecipients((err, recipients) => { if (err) return console.error(err); console.log("获取到的收件人列表:", recipients); }); - 交互引导
在触发收件人读取的操作入口增加提示:请输入完每个收件人后按分号/回车确认,再执行提交操作,引导用户主动完成收件人解析,避免临时文本未入库的问题。
注意事项
- 上述焦点转移方案兼容Outlook网页版、2016+版本Windows桌面客户端、Mac端Outlook
- 禁止通过DOM注入直接读取原生收件人输入框的文本内容,该操作违反Office外接程序安全规范,会导致外接程序无法通过Microsoft AppSource审核。
内容的提问来源于stack exchange,提问作者raphaël schaffo
相关产品推荐
相关产品推荐

