Outlook Web Addin发送邮件时修改邮件正文的问题求助
问题解决:Outlook Web加载项发送邮件时修改正文,setAsync/setSelectedDataAsync回调不执行
核心问题原因
你的代码里event.completed()在异步操作完成前就被调用了。Office的ExecuteOnSend事件要求必须在所有处理逻辑(包括异步操作)完成后再调用event.completed(),否则Office会提前终止事件流程,导致后续的异步回调根本没机会执行。
解决方案
把Office的异步方法(getAsync、setSelectedDataAsync)封装成Promise,利用async/await确保所有异步操作完成后再通知Office事件结束。
修改后的完整代码
// INITIALIZE OFFICE Office.initialize = function () {} // 封装Office异步方法为Promise,支持await function getBodyAsync(item, format) { return new Promise((resolve, reject) => { item.body.getAsync(format, (response) => { if (response.status === 'succeeded') { resolve(response.value); } else { reject(response.error); } }); }); } function setBodySelectedDataAsync(item, data, options) { return new Promise((resolve, reject) => { item.body.setSelectedDataAsync(data, options, (response) => { if (response.status === 'succeeded') { resolve(); console.log("SUCCESS"); } else { reject(response.error); console.log("FAILED"); } }); }); } // THIS FUNCTION IS USED TO EXECUTE ON SEND EVENT async function ExecuteOnSend(event) { try { const mail_item = Office.context.mailbox.item; // 等待获取邮件正文完成 await getBodyAsync(mail_item, 'html'); // 等待设置正文完成 await setBodySelectedDataAsync(mail_item, "Hello world", { coercionType: Office.CoercionType.Html }); } catch (error_message) { console.log("Error occurred : " + error_message); } finally { // 所有操作完成后再通知Office事件结束 event.completed(); } } // REGISTRATION OF FUNCTIONS Office.actions.associate("ExecuteOnSend", ExecuteOnSend);
关键改动说明
- 用Promise封装
getAsync和setSelectedDataAsync,让异步操作可以用await等待完成,避免回调嵌套和提前结束事件 - 将
event.completed()移到finally块中,确保无论操作成功还是失败,都会在最后通知Office事件结束 - 保留原日志输出逻辑的同时,保证异步流程按顺序执行
额外注意事项
- 确认加载项清单中已正确声明
ReadWriteMailbox权限,否则无法修改邮件正文 - 如果需要基于原正文修改内容,可以在
getBodyAsync的resolve中拿到原正文内容,拼接后再传入setBodySelectedDataAsync
内容的提问来源于stack exchange,提问作者Smit Rathod
相关产品推荐
相关产品推荐

