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

技术咨询:如何通过上下文加载项触发Outlook侧边栏及功能实现

实现Outlook侧边栏上下文加载项展示邮件实体及详情的方案

当然可行!我帮你梳理一下具体的实现思路和步骤,你可以基于Office.js结合Microsoft Graph API来完成这个需求:

一、核心可行性确认

Outlook的上下文加载项本身就支持基于邮件内容触发,并通过API获取邮件中的实体数据;再结合Graph API可以拉取更丰富的实体详情,完全能实现你想要的「基础信息展示+按钮触发详情」的流程。

二、具体实现步骤

1. 配置加载项的触发规则(Manifest.xml)

首先要在加载项的清单文件里设置触发条件,让加载项在包含目标实体的邮件打开时自动激活:

  • 如果是Outlook自动识别的标准实体(比如联系人、事件、URL、电话号码),可以用ItemHasKnownEntity规则,指定实体类型(如Contact、Event);
  • 如果是自定义实体(比如订单号、产品ID),可以用ItemHasRegularExpressionMatch规则,匹配邮件正文中的特定格式内容。

示例Manifest片段:

<ExtensionPoint xsi:type="MessageReadCommandSurface">
  <OfficeTab id="TabDefault">
    <Group id="msgReadGroup">
      <Label resid="GroupLabel"/>
      <Control xsi:type="Button" id="msgReadOpenPaneButton">
        <Label resid="TaskpaneButtonLabel"/>
        <Supertip>
          <Title resid="TaskpaneButtonLabel"/>
          <Description resid="TaskpaneButtonDesc"/>
        </Supertip>
        <Icon>
          <bt:Image size="16" resid="Icon.16x16"/>
          <bt:Image size="32" resid="Icon.32x32"/>
          <bt:Image size="80" resid="Icon.80x80"/>
        </Icon>
        <Action xsi:type="ShowTaskpane">
          <SourceLocation resid="Taskpane.Url"/>
        </Action>
      </Control>
    </Group>
  </OfficeTab>
</ExtensionPoint>
<!-- 上下文触发规则:匹配邮件中的联系人实体 -->
<Rule xsi:type="RuleCollection" Mode="Or">
  <Rule xsi:type="ItemHasKnownEntity" EntityType="Contact" Highlight="true"/>
</Rule>

2. 用Office.js解析并展示实体基础信息

加载项激活后,通过Office.js的API获取当前邮件中的实体数据,然后在侧边栏渲染基础信息和操作按钮:

Office.initialize = () => {
  // 获取当前邮件对象
  const currentMail = Office.context.mailbox.item;
  
  // 获取邮件中的所有联系人实体
  const contactEntities = currentMail.getEntitiesByType(Office.MailboxEnums.EntityType.Contact);
  
  if (contactEntities.length > 0) {
    // 渲染第一个联系人的基础信息
    renderBasicEntityInfo(contactEntities[0]);
  }
};

// 渲染基础信息到侧边栏
function renderBasicEntityInfo(entity) {
  const basicInfoContainer = document.getElementById('basic-info');
  basicInfoContainer.innerHTML = `
    <h3>${entity.displayName}</h3>
    <p>邮箱: ${entity.emailAddresses[0]}</p>
    <button class="detail-btn" onclick="loadEntityDetails('${entity.emailAddresses[0]}')">查看详细信息</button>
  `;
}

3. 点击按钮加载并展示实体详细信息

这里分两种场景处理:

  • 如果Office.js返回的实体数据已经包含足够详情,直接切换UI渲染即可;
  • 如果需要更丰富的信息(比如联系人的公司、职位、电话等),调用Microsoft Graph API获取:
async function loadEntityDetails(email) {
  // 获取访问令牌(用于调用Graph API)
  Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, async (result) => {
    if (result.status === Office.AsyncResultStatus.Succeeded) {
      const accessToken = result.value;
      
      // 调用Graph API,通过邮箱查找联系人详情
      const response = await fetch(
        `https://graph.microsoft.com/v1.0/me/contacts?$filter=emailAddresses/any(a:a/address eq '${email}')`,
        {
          headers: { 'Authorization': `Bearer ${accessToken}` }
        }
      );
      
      const contactData = await response.json();
      if (contactData.value.length > 0) {
        // 渲染详细信息
        renderDetailedEntityInfo(contactData.value[0]);
      }
    }
  });
}

// 渲染详细信息到侧边栏
function renderDetailedEntityInfo(detail) {
  const detailContainer = document.getElementById('detailed-info');
  detailContainer.innerHTML = `
    <h2>${detail.displayName}</h2>
    <p>工作电话: ${detail.businessPhones[0] || '未填写'}</p>
    <p>公司: ${detail.companyName || '未填写'}</p>
    <p>职位: ${detail.jobTitle || '未填写'}</p>
    <p>工作地址: ${detail.businessAddress?.street || ''} ${detail.businessAddress?.city || ''}</p>
  `;
  
  // 切换UI显示:隐藏基础信息,展示详情
  document.getElementById('basic-info').style.display = 'none';
  detailContainer.style.display = 'block';
}

4. 关键注意事项

  • 权限配置:在Manifest里声明必要的权限(比如ReadItem),同时在Azure AD应用注册中添加Graph API的权限(比如Contacts.Read),确保加载项能正常调用API;
  • 自定义实体处理:如果是Outlook未识别的自定义实体,需要用ItemHasRegularExpressionMatch触发加载项,然后通过currentMail.body.getAsync()获取邮件正文,自行用正则匹配提取实体;
  • UI交互优化:做好侧边栏的内容切换动画、加载状态提示,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:03:08