我正在使用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&X-OWA-CANARY=Dg0nza5wGEudJBx_zc2m9bCVF8Ea6dIYZGUuP-qzYHeYA49c7Ddf2wAF8k5zVa6hpRn6AhTjnaE." id="img295971" style="display: inline; max-width: 100%;">
关于我需要做些什么才能让这些图像显示出来?
答案 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 文档中的更多详细信息: