Outlook JavaScript api attachments

Outlook JavaScript api attachments

本文关键字:attachments api JavaScript Outlook      更新时间:2024-01-23

当前正在开发JavaScript中的Office Add-In,我注意到Outlook Windows富客户端和Office365 Web门户在API可用性方面存在一些差异。

我的外接程序目前在"web"模式下运行得很好,但在富客户端中并不像预期的那样。

外接程序获取电子邮件正文+附件,并将其发送到远程应用程序服务器。

Office.context.mailbox.item.body.getAsync(Office.CoercionType.Html, { asyncContext: "html" }, function callback(resHtml) {
    // dealing with email in HTML format
});

对于附件,我是这样做的:

for (var i = 0; i < Office.context.mailbox.item.attachments.length; i++) {
    var _att = Office.context.mailbox.item.attachments[i];
    attachments.assets.push({
        name: _att.name,
        id: _att.id,
        contentType: _att.contentType,
        size: _att.size,
        attachmentType: _att.attachmentType,
        isInline: _att.isInline
    });
}

(JS加载项只向远程应用程序发送附件元数据。远程应用程序必须连接到Exchange EWS才能使用提供的元数据实际获取附件)

问题

当电子邮件中附加了内联图像时,门户网站和富客户端在输出HTML:中显示的图像完全不同

门户网站

<img originalSrc="cid:image004.png@01D18392.E4A15FE0"   src="data:image/gif;base64,..." width="310" height="15" id="x__x0000_i1030" alt="...">

富客户端

<img src="~WRS%7b0E0FFAA4-6FC0-49C1-9BB6-3D1A2F5211F1%7d_fichiers/image001.jpg" width=906 height=245 id="Picture 6">

另一方面,方法Office.context.mailbox.item.attachments返回这类对象:

{
    "_data$p$0": {
        "id": "AAMkAGI2MjY4MGQ....",
        "name": "image004.png",
        "contentType": "image/png",
        "size": 427,
        "attachmentType": 0,
        "isInline": true
    }
}

很明显,通过名称将内联图像映射到门户网站HTML中的"cid:XYZ",我应该如何在富客户端中映射它们?

几乎没有观察到:即使attachmentJS对象说图像有点像image003.png,图像的<img>标签也根本没有反射它,而是显示出类似~WRS...../image001.gif的东西。(文件名不一致,扩展名不匹配)

谢谢:)

我找到了一个解决方法,我把它发布在这里,以防有人面临同样的问题。

使用JS API,可以检索访问令牌,该令牌可以进一步用于后端连接到SOAP Exchange Web服务(EWS)。

访问令牌可通过Office.context.mailbox.getCallbackTokenAsync方法检索

一旦收集了令牌、itemId和EwsURL并将其发送到后端,就可以使用EWS以纯文本或HTML格式检索邮件正文,HTML中正确指定了内联图像。

您将收到类似<img src="cid:xyz@123" />的内容,它与之前检索到的附件对象完全匹配。

额外奖励:当连接到EWS时,您传统上使用登录/密码对进行连接。在这种情况下,您不知道这些凭据。HTTP标头通常包含:

Authorization: Basic [credentials]

要通过访问令牌向EWS进行身份验证,您必须将其设置如下:

Authorization: Bearer [accessToken]