You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:52:12