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

如何通过Outlook JS API获取收件箱所有邮件?React开发Office加载项求助

当然可以!用React开发Outlook加载项时,要获取收件箱或指定文件夹的全部邮件并执行操作,你需要结合Office.js的Mailbox API和Microsoft Graph API来实现——毕竟Office.context.mailbox确实主要聚焦在当前选中的邮件,但Graph能帮你拿到批量邮件数据。

核心实现思路

Office.js提供了获取访问令牌的能力,用这个令牌就能调用Microsoft Graph API,从而访问用户的所有邮件文件夹和邮件内容。下面是具体的步骤和React示例:

1. 配置加载项权限

首先要在你的加载项manifest.xml文件中声明足够的权限,这样才能获取到访问Graph的令牌。比如需要读取邮件的话,添加:

<Permissions>ReadMailbox</Permissions>

如果需要修改邮件,就用ReadWriteMailbox。这个权限会决定令牌能访问的Graph资源范围。

2. 获取Graph兼容的访问令牌

用Office.context.mailbox.getCallbackTokenAsync方法获取令牌,记得设置isRest: true参数,这样拿到的令牌可以直接用于Graph API请求:

// React组件中的异步函数示例
const getGraphToken = async () => {
  return new Promise((resolve, reject) => {
    Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, (result) => {
      if (result.status === Office.AsyncResultStatus.Succeeded) {
        resolve(result.value);
      } else {
        reject(new Error(`获取令牌失败: ${result.error.message}`));
      }
    });
  });
};

3. 调用Graph API获取收件箱邮件

拿到令牌后,就可以发起请求获取收件箱的邮件了:

const fetchInboxMessages = async () => {
  try {
    const token = await getGraphToken();
    const response = await fetch('https://graph.microsoft.com/v1.0/me/mailfolders/inbox/messages', {
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json'
      }
    });

    if (!response.ok) {
      throw new Error(`Graph请求失败: ${response.status} ${response.statusText}`);
    }

    const data = await response.json();
    // data.value就是收件箱的邮件列表,默认返回前10条,支持分页
    console.log('收件箱邮件:', data.value);
    return data.value;
  } catch (err) {
    console.error('获取邮件出错:', err);
    throw err;
  }
};

4. 访问指定文件夹的邮件

如果要获取非收件箱的其他文件夹,首先需要获取目标文件夹的ID:

// 获取所有邮件文件夹
const fetchMailFolders = async () => {
  const token = await getGraphToken();
  const response = await fetch('https://graph.microsoft.com/v1.0/me/mailfolders', {
    headers: { Authorization: `Bearer ${token}` }
  });
  const data = await response.json();
  // 找到目标文件夹,比如"已发送邮件"
  const targetFolder = data.value.find(folder => folder.displayName === "已发送邮件");
  return targetFolder?.id;
};

拿到文件夹ID后,替换Graph请求的端点:

const folderId = await fetchMailFolders();
const response = await fetch(`https://graph.microsoft.com/v1.0/me/mailfolders/${folderId}/messages`, {
  headers: { Authorization: `Bearer ${token}` }
});

5. 对邮件执行操作

获取到邮件列表后,你可以通过Graph API执行各种操作:

  • 标记已读/未读:PATCH https://graph.microsoft.com/v1.0/me/messages/{message-id},请求体{ "isRead": true }
  • 移动邮件:POST https://graph.microsoft.com/v1.0/me/messages/{message-id}/move,请求体{ "destinationId": "{folder-id}" }
  • 删除邮件:DELETE https://graph.microsoft.com/v1.0/me/messages/{message-id}

注意事项

  • 分页处理:Graph API默认每次返回10条邮件,如果邮件数量多,需要用$top参数指定每页数量,以及@odata.nextLink来获取下一页数据
  • 初始化时机:在React组件中调用Office.js方法时,要确保Office已经初始化完成(可以在Office.initialize回调后执行相关逻辑)
  • 权限验证:测试时确保你的Outlook账号有对应的邮件访问权限,加载项也已正确部署调试

内容的提问来源于stack exchange,提问作者scottyak12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:38:14