首页 > 解决方案 > 如何在反应加载项中使用 Office.js 获取消息

问题描述

我正在构建一个新的 react Outlook 插件,需要能够下载当前的电子邮件。

Office.js API 具有 Office.context.document 对象而非 Office.context.mailbox.item 对象的 getFileAsync 方法。

同样作为一项要求,这需要在 Office 在线和 Outlook 的本地安装中工作。

在现有的 com 插件中,我可以直接访问邮件项目。

这是我目前必须调用 API 的代码,但这仅检索元数据。

/*
  https://docs.microsoft.com/en-us/outlook/add-ins/use-rest-api#get-the-item-id
  */
  public getMessageViaRest = () => {
    const context: Office.AsyncContextOptions & { isRest: boolean } = {
      isRest: true
    };

    Office.context.mailbox.getCallbackTokenAsync(context, (tokenResults) => {
      if (tokenResults.status === Office.AsyncResultStatus.Failed) {
        this.setState({ error: 'Failed to get rest api auth token' });
        return;
      }

      const apiId: string = Office.context.mailbox.convertToRestId(Office.context.mailbox.item.itemId, 'v2.0');
      const apiUrl = Office.context.mailbox.restUrl + '/v2.0/me/messages/' + apiId;

      try {
        fetch(apiUrl, {
          method: 'GET',
          headers: new Headers({
            Authorization: 'Bearer ' + tokenResults.value
          })
        }).then((response) => {
          response.json().then((body) => {
            for (const key in body) {
              this.state.details.push({ name: key, value: JSON.stringify(body[key]) });
            }
            this.forceUpdate();
          });
        });
      } catch (error) {
        this.setState({ error: JSON.stringify(error) });
      }
    });
  }

标签: outlookadd-in

解决方案


它并不完美,但 REST Api 确实有一个端点,它将返回文件的 EML 内容。

public downloadViaRest = () => {
    const context: Office.AsyncContextOptions & { isRest: boolean } = {
      isRest: true
    };

    Office.context.mailbox.getCallbackTokenAsync(context, (tokenResults) => {
      if (tokenResults.status === Office.AsyncResultStatus.Failed) {
        this.setState({ error: 'Failed to get rest api auth token' });
        return;
      }

      const apiId: string = Office.context.mailbox.convertToRestId(Office.context.mailbox.item.itemId, 'v2.0');
      const apiUrl = Office.context.mailbox.restUrl + '/v2.0/me/messages/' + apiId + '/$value';

      try {
        fetch(apiUrl, {
          method: 'GET',
          headers: new Headers({
            Authorization: 'Bearer ' + tokenResults.value
          })
        }).then((response) => {
          response.blob().then((blob) => {
            const url = window.URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'Message.eml';
            a.click();
          });
        });
      } catch (error) {

      }
    });
  }

推荐阅读