【问题标题】:Displaying CID Embedded Images from outlook email using the API使用 API 显示来自 Outlook 电子邮件的 CID 嵌入式图像
【发布时间】:2015-11-09 15:32:53
【问题描述】:

我正在使用 REST API 从 Office 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">

如果我在 Office 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%;">

关于我需要做什么来显示这些图像有什么想法吗?

【问题讨论】:

  • 我做这样的事情:在这样的目录结构中获取所有附件 /attachments/[ID_MESSAGE]/[ID_ATTACHMENT]/ 所以..现在如果我在消息 cid 的内容正文中找到:“”我按 cid 的模式搜索并在与该 cid 匹配的文件夹结构文件中搜索。然后我用该文件的 url 替换整个 cid 的东西。

标签: rest outlook office365 office365api office365-restapi


【解决方案1】:

这可能不是一个完整的答案,但这是我们处理它的方式。 @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 文档中的更多详细信息:

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请添加一些解释。您的答案可能会被标记为“低质量”,最终可能会被删除。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2022-09-25
    • 2015-02-17
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多