我已经有一段时间以来一直在解决这个问题,并且未能在网上找到有效的答案。我正在使用Exchange EWS API进行一些电子邮件处理。我需要处理的一件事是EmailMessage,它上面有附件。其中一个附件碰巧是另一个EmailMessage。我将此称为附加的EmailMessage。
我想将此EmailMessage转换为byte [],但每次尝试时都会出现异常。以下是我的代码:
{{1}}
问题是无论我尝试加载什么,我都会抛出异常说
类型' System.InvalidOperationException'的例外情况发生在Microsoft.Exchange.WebServices.dll但未在用户代码中处理
附加信息:附件不支持此操作。
如果我没有调用msg.Load(),我会收到一个不同的错误,说我需要加载内容。
我不明白这一点。如果我对没有附加到任何东西的EmailMessage执行相同的操作,它就可以正常工作。为什么EmailMessage在某个时间点是附件?我怎样才能获得EWS / .NET / Whatever抛出异常来将附加的EmailMessage视为EmailMessage而不是ItemAttachment?
答案 0 :(得分:2)
您需要在嵌入式附件上对Each使用GetAttachments操作,并使用包含MimeContent的属性集。例如(如果您处理多个消息等,这可以通过对GetAttachment请求进行分组来提高效率)。
PropertySet psPropSet = new PropertySet(BasePropertySet.FirstClassProperties);
psPropSet.Add(ItemSchema.MimeContent);
foreach (Attachment attachment in CurrentMessage.Attachments)
{
if (attachment is ItemAttachment)
{
attachment.Load();
if (((ItemAttachment)attachment).Item is EmailMessage)
{
EmailMessage ebMessage = ((ItemAttachment)attachment).Item as EmailMessage;
foreach (Attachment ebAttachment in ebMessage.Attachments)
{
if (ebAttachment is ItemAttachment)
{
Attachment[] LoadAttachments = new Attachment[1];
LoadAttachments[0] = ebAttachment;
ServiceResponseCollection<GetAttachmentResponse> getAttachmentresps = service.GetAttachments(LoadAttachments, BodyType.HTML, psPropSet);
foreach (GetAttachmentResponse grResp in getAttachmentresps)
{
EmailMessage msg = ((ItemAttachment)grResp.Attachment).Item as EmailMessage;
msg.Load(new PropertySet(ItemSchema.MimeContent));
byte[] content = msg.MimeContent.Content;
}
}
}
}
}
}
答案 1 :(得分:0)
您必须加载带有标志的附件才能加载MimeContent:
{
if (attachment is ItemAttachment ia)
{
ia.Load(ItemSchema.MimeContent);
}
}