outlook - 如何在反应加载项中使用 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) });
}
});
}
解决方案
它并不完美,但 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) {
}
});
}
推荐阅读
- javascript - 尝试为不同的当前页面调用不同的方法时出现问题?
- google-sheets - 如何从 Google 表格中的单元格中获取值进行增量值更改?
- azure - Azure 应用服务日志和诊断设置之间的区别
- for-loop - 谷歌表格自适应列表?
- spring - Spring Data - 按赞排序
- javascript - 地图标记不聚类
- python - 加载所有 Scapy 层而不是一层一层加载的更好方法
- javascript - 如何访问映射项中的数据?
- python - 如何替换包含列的列表的所有元素?
- c# - 如何在 C# 中仅将 datagridview 中的选定行导入 rdlc 报告