Outlook插件:如何获取会话中回复目标邮件的正文?
解决方案:精准获取回复目标邮件的正文
核心思路
不要通过会话ID过滤全会话邮件,而是直接定位被回复的原始邮件ID,再调用MS Graph的单邮件接口获取正文,从根源避免会话邮件冗余问题。
步骤1:校验当前撰写场景
只有在回复、回复全部或转发的撰写窗口中,才能拿到被回复的原始邮件信息,先做场景判断:
Office.context.mailbox.item.getComposeTypeAsync((composeResult) => { if (composeResult.status !== Office.AsyncResultStatus.Succeeded) { console.error('获取撰写类型失败:', composeResult.error); return; } const validComposeTypes = [ Office.MailboxEnums.ComposeType.Reply, Office.MailboxEnums.ComposeType.ReplyAll, Office.MailboxEnums.ComposeType.Forward ]; if (!validComposeTypes.includes(composeResult.value)) { console.log('当前非回复/转发场景,无法获取目标邮件'); return; } // 进入目标邮件ID获取流程 getOriginalMessageId(); });
步骤2:获取被回复的原始邮件ID
通过Office.js提供的originalItem对象异步获取目标邮件的唯一ID:
function getOriginalMessageId() { Office.context.mailbox.item.originalItem.getIdAsync((idResult) => { if (idResult.status !== Office.AsyncResultStatus.Succeeded) { console.error('获取原始邮件ID失败:', idResult.error); return; } const targetMsgId = idResult.value; // 调用Graph接口获取正文 fetchTargetMessageBody(targetMsgId); }); }
步骤3:调用MS Graph获取目标邮件正文
用Office.js获取的授权Token调用Graph单邮件接口,直接拿到目标邮件的正文内容:
function fetchTargetMessageBody(messageId) { // 获取Graph授权Token(需Manifest配置对应权限) Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, (tokenResult) => { if (tokenResult.status !== Office.AsyncResultStatus.Succeeded) { console.error('获取授权Token失败:', tokenResult.error); return; } const accessToken = tokenResult.value; const graphUrl = `https://graph.microsoft.com/v1.0/me/messages/${encodeURIComponent(messageId)}`; fetch(graphUrl, { method: 'GET', headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' } }) .then(res => { if (!res.ok) throw new Error(`Graph请求失败: ${res.statusText}`); return res.json(); }) .then(msg => { // 目标邮件正文存于msg.body.content,支持HTML或纯文本格式 const targetBody = msg.body.content; console.log('目标邮件正文:', targetBody); // 此处可添加正文处理逻辑(如插入到当前撰写窗口) }) .catch(err => console.error('处理Graph响应失败:', err)); }); }
关键配置注意事项
- 插件Manifest中需配置足够权限:
<Permissions>ReadWriteMailbox</Permissions>(或至少MailRead) - 确保插件在撰写模式下激活,需在Manifest的
<Rule>中配置ItemIs为Message且FormType为Edit
内容的提问来源于stack exchange,提问作者Noman Aslam
相关产品推荐
相关产品推荐

