使用API​​从Outlook电子邮件中显示CID嵌入式图像

时间:2015-11-09 15:32:53

标签: rest outlook office365 office365api office365-restapi

我正在使用REST API从办公室365帐户收集电子邮件的内容,然后使用它通过iframe在单独的基于Web的平台上显示电子邮件(以避免css冲突)。

但是,嵌入的图像和表情符号都显示为损坏的图像,因为它们是CID嵌入的。

以下是我从API中获得的内容......

<img size="96043" contenttype="image/png" id="img295971" tabindex="0" style="max-width: 99.9%; -webkit-user-select: none;" src="cid:1af2f0cb-83b4-46b7-aad6-8ea69256282c">

如果我在办公室365中查看相同的电子邮件,这就是它的样子......

<img originalsrc="cid:1af2f0cb-83b4-46b7-aad6-8ea69256282c" data-custom="EAMkADc2ZjU0ZjU5LTVmOTAtNDZiZC05ZTMyLWFmYTBmNTBkMTc2NQBGAAAAAACbfH93Aq8QSYpfwBCQxPfnBwDmFINdPPDZS5lgCNopiLnYAAAAAAEMAADmFINdPPHZS5lgCNopiLnYAABYntBTAAABEgAQAOVziLpVtbxHtEZu7MUJkA0%3D" src="service.svc/s/GetFileAttachment?id=EAMkADc2ZjU0ZjU5LTVmOTAtNDZiZC05ZTMyLWFmYTBmNTBkMTc2NQBGAAAAAACbfH93Aq8QSYpfwBCQxPfnBwDmFINdPPDZS5lgCNopiLnYAAAAAAEMAADmFINdPPHZS5lgCNopiLnYAABYntBTAAABEgAQAOVziLpVtbxHtEZu7MUJkA0%3D&amp;X-OWA-CANARY=Dg0nza5wGEudJBx_zc2m9bCVF8Ea6dIYZGUuP-qzYHeYA49c7Ddf2wAF8k5zVa6hpRn6AhTjnaE." id="img295971" style="display: inline; max-width: 100%;">

关于我需要做些什么才能让这些图像显示出来?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用邮件ID获取附件列表。 (不要担心HasAttachments =&gt; false)。您将获得所有CID嵌入式图像文件。

答案 1 :(得分:0)

这可能不是一个完整的答案,但这是我们处理它的方式。 @hom nom 是正确的,每个图像都附有 CID 信息。但是,这本身并没有为您提供显示它的直接方式。但是,REST 数据确实包含 AttachmentContent 和 ContentId (CID)。所以我们将内容保存到我们可以引用的地方,然后用我们的本地图像 URL 替换 CID 图像 URL。很想知道是否有人找到了更好的解决方案。

具体来说: 获取邮件的附件:

private List<Attachment> GetMessageAttachments(string messageId, string recipientId)
    {
        IMessageAttachmentsCollectionPage newAttachments = null;
        List<Attachment> returnAttachments = new List<Attachment>();
        var nextRequest = graphClient.Users[recipientId].Messages[messageId].Attachments.Request();
        while (nextRequest != null)
        {
            newAttachments = nextRequest.GetAsync().Result;
            returnAttachments.AddRange(newAttachments);
            nextRequest = newAttachments.NextPageRequest;
        }
        return returnAttachments;
    }

获取附件内容:

public byte[] GetAttachmentBody(string userId, string messageId, string attachmentId)
    {
        string url = $"Users/{userId}/messages/{messageId}/attachments/{attachmentId}/$value";

        RestRequest request = new RestRequest(url, Method.GET);
        IRestResponse response = restClient.Execute(request);
        if (response.StatusCode != System.Net.HttpStatusCode.OK) throw new HttpRequestValidationException($"Invalid response: {response.Content}");
        return Encoding.ASCII.GetBytes(response.Content);
    }

MS Graph 文档中的更多详细信息: