如何从Exchange EWS中的ItemAttachment对象保存附加的EmailMessage?

时间:2016-03-11 22:41:31

标签: c# exchangewebservices

我已经有一段时间以来一直在解决这个问题,并且未能在网上找到有效的答案。我正在使用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?

2 个答案:

答案 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);
        }

}