【问题标题】:Moving Email Attachment to another folder in Outlook将电子邮件附件移动到 Outlook 中的另一个文件夹
【发布时间】:2014-10-23 12:47:54
【问题描述】:

我想将我的电子邮件附件移动/复制到 Outlook 中的新文件夹;/我的代码无法正常工作。

foreach(Item item in findResults.Items)
        {                
             EmailMessage email = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Attachments));

             if(false)
             {
                 // OTC Marker HTML Body
             }
             else
             {
                 if (email.HasAttachments)
                 {
                     foreach (Attachment attachment in email.Attachments)
                     {
                         EmailMessage emailAttachment = EmailMessage.Bind(service, attachment.Id, new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Attachments));

                         ItemAttachment itemAttachment = attachment as ItemAttachment;
                         itemAttachment.Load();

                         EmailMessage mess = itemAttachment.Item as EmailMessage;
                         moveToTestFolder (mess, @"TestFolder");
                     }
                 }
                 else
                 {
                     //to do
                 }
             }  
           }

还有我的 moveToTestFolder 方法:

    private void moveToTestFolder (EmailMessage item, string folderName)
    {
       Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot);
       rootfolder.Load();

       var folders = rootfolder.FindFolders(new FolderView(20));
       var folderItemToMove = folders.FirstOrDefault(f => f.DisplayName.Equals(folderName, StringComparison.OrdinalIgnoreCase));

       item.Move(folderItemToMove.Id);
    }

我正在尝试将附件(如果是电子邮件)移动到 Outlook 中的特殊文件夹。移动正常消息现在正在工作。

【问题讨论】:

  • 您需要解释“无法正常工作”是什么意思。
  • 我的意思是什么都没发生;/
  • 您是否尝试使用调试器逐步完成您的方法?如果什么都没发生,我很确定您正在捕获并吞下代码中某个时刻出现的异常。
  • 这里有问题,这是服务;/
  • 在这种情况下,您将有 2 个选项:a) 将 Logging/Tracing 添加到您的服务以跟踪处理。 b) 为您的方法创建单元测试。不用说,选项 b) 更可取,因为它允许您在 Visual Studio 中运行测试时调试代码,并且不会因跟踪输出调用而污染您的代码。作为第一次紧急情况,我建议确保所有异常都会被抛出,这样您就会在 Windows 事件日志中看到发生的错误。

标签: c# exchange-server


【解决方案1】:

这不起作用,因为您只能使用“移动”和“复制”操作来复制实际的邮箱项目而不是附件(您应该收到关于无效 ID 的错误)。一种解决方法是获取您要移动的电子邮件附件的 MimeContent,然后从该 MimeCotent 创建一个新对象并将其保存到您要将项目移动到的文件夹中,例如

        foreach (Attachment Attach in EWSItem.Attachments)
        {
            if (Attach is ItemAttachment)
            {
                PropertySet psProp = new PropertySet(BasePropertySet.FirstClassProperties);
                psProp.Add(ItemSchema.MimeContent);
                ((ItemAttachment)Attach).Load(psProp);
                if (((ItemAttachment)Attach).Item.MimeContent != null)
                {
                    EmailMessage NewMessage = new EmailMessage(service);
                    NewMessage.MimeContent = ((ItemAttachment)Attach).Item.MimeContent;
                    NewMessage.SetExtendedProperty(new ExtendedPropertyDefinition(3591, MapiPropertyType.Integer), "1");
                    NewMessage.Save(folderItemToMove.Id);
                }
            }
        }  

您无法使用此方法获得消息上所有 Exchange 属性的完整保真度,因为仅复制了 MimeContent,这通常不是电子邮件的问题,但对于其他对象类型(如联系人、任务等)来说将是一个问题。

干杯 格伦

【讨论】: