【问题标题】:C# MS Exchange Move Email To FolderC# MS Exchange 将电子邮件移动到文件夹
【发布时间】:2012-11-21 01:38:16
【问题描述】:

补充:感谢用户@grapkulec,我正在使用

using Microsoft.Exchange.WebServices.Data;

我正在尝试将电子邮件移至已在 Outlook 中创建的文件夹(使用 MS Exchange)。到目前为止,我已经能够将电子邮件移动到草稿或另一个众所周知的文件夹名称,但没有成功将其移动到我创建的名为“示例”的文件夹中。

foreach (Item email in findResults.Items)
email.Move(WellKnownFolderName.Drafts);

上面的代码有效;但我不想使用众所周知的文件夹。而且,如果我尝试将代码更改为:

email.Move(Folder.(Example));

email.Move(Folder.["Example"]);

它不动(在这两种情况下,都会引发错误)。我在 MSDN、SO 和一般 C# 上找到了大量关于如何将电子邮件移动到文件夹中的示例 - 但 是 Outlook“众所周知”的文件夹(草稿、垃圾邮件等),这不适用于我创建的文件夹。

【问题讨论】:

    标签: c# exchange-server email


    【解决方案1】:

    您似乎正在使用 EWS 托管 API,所以这是我如何做这些事情的答案。

    项目的移动方法可以接受 WellKnownFolderName 或文件夹 id。如果我理解正确,您希望将您的电子邮件移动到名为“示例”的文件夹中。所以首先你需要得到这个文件夹的文件夹对象:

    var filter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Example");
    var view = new FolderView(1)
    {
        PropertySet = new PropertySet(BasePropertySet.FirstClassProperties)
    };
    var findFoldersResults = exService.FindFolders(filter, view);
    folder = findFoldersResults.FirstOrDefault(f => f.DisplayName.Equals("Example", StringComparison.OrdinalIgnoreCase));
    

    现在您应该拥有“示例”文件夹变量,并且可以将其 id 传递给电子邮件的 Move 方法。有关更多详细信息,请查看有关如何使用 EWS 托管 API 的 msdn 页面,那里有很多简单和基本的使用示例。

    顺便说一句:WellKnownFolderNames 枚举是最常见的 Exchange 文件夹(如收件箱、已发送邮件等)的便捷类型。如果是任何其他 Exchange 对象,您必须通过搜索和/或绑定自行检索任何其他内容。

    【讨论】:

    • 我正在尝试这个;但是,我已经访问了 MSDN 页面,我会提醒其他用户远离这个问题。它们非常无用;他们只使用具有众所周知的文件夹名称的示例 - 相同的语法不适用于创建的文件夹。到目前为止,例如,使用他们的 bind 方法,移动没有成功。 find 方法也没有取得任何成功。除非,当然,你想把它移动到一个众所周知的文件夹!
    • 不幸的是,这会产生几个重载错误,因此它与当前代码不兼容。
    • 嗯,这正是我在高负载和完全不同环境中工作的产品中使用的代码,所以我知道它可以工作。但我不会说我第一次写得很完美,在我理解所有部分是如何组合在一起之前,我花了很多谷歌浏览并尝试了一个错误。也许您应该使用当前代码 sn-p 更新您的问题,以便我们可以看到一些上下文。您关于移动到文件夹的问题已经得到解答。抱歉,如果您努力使我的示例正常工作,但在不了解更多详细信息的情况下看不到我如何提供更多帮助。
    • @Peroxy 究竟是什么不起作用? “它不起作用”是我希望听到的来自客户而不是来自其他开发人员的消息 :)
    • 正如上面 OP 所说:不幸的是,这会产生几个重载错误,因此它与当前代码不兼容。
    【解决方案2】:

    解决了!

    Move 命令失败了,因为 ID 格式错误,尽管尝试了几次。显然,移动操作不允许使用名称。我曾尝试将DisplayName 作为标识符,这就是让我失望的原因。最后,我放弃了DisplayName,这会有所帮助。相反,我通过将 ID 存储在一个变量中来指向 ID(它停止了烦人的“ID 格式错误”错误),并且移动工作了。

    代码:

    Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot);
    rootfolder.Load();
    
    foreach (Folder folder in rootfolder.FindFolders(new FolderView(100)))
    {
        // Finds the emails in a certain folder, in this case the Junk Email
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.JunkEmail, new ItemView(10));
    
        // This IF limits what folder the program will seek
        if (folder.DisplayName == "Example")
        {
            // Trust me, the ID is a pain if you want to manually copy and paste it. This stores it in a variable
            var fid = folder.Id;
            Console.WriteLine(fid);
            foreach (Item item in findResults.Items)
            {
                // Load the email, move the email into the id.  Note that MOVE needs a valid ID, which is why storing the ID in a variable works easily.
                item.Load();
                item.Move(fid);
            }
        }
    }
    

    【讨论】:

    • 如果该代码正在运行,您真的应该使用过滤器来获取您的“示例”文件夹。即使没有过滤器,您也应该将 FindItems 移到循环之外,因为获得完全相同的项目多达 100 次又有什么意义呢? ExchangeService 类中还有 MoveItems 方法,可以在一次调用中移动多个项目。所以基本上你的代码可能需要 3-4 行代码(当然不包括安全 ifs 等)
    • 谢谢;此代码有效,并且可以调整到可以进行适当调整的位置。
    【解决方案3】:

    基于这些答案,创建了一种移动到文件夹的工作方法,可能对某人有用:

    /// <summary>
    /// Moves the email to the specified folder.
    /// </summary>
    /// <param name="mail">Email message to move.</param>
    /// <param name="folderName">Display name of the folder.</param>
    public void MoveToFolder(EmailMessage mail, string folderName)
    {
        Folder rootfolder = Folder.Bind(_exchangeService, WellKnownFolderName.MsgFolderRoot);
        rootfolder.Load();
        Folder foundFolder = rootfolder.FindFolders(new FolderView(100)).FirstOrDefault(x => x.DisplayName == folderName);
        if (foundFolder == default(Folder))
        {
            throw new DirectoryNotFoundException(string.Format("Could not find folder {0}.", folderName));
        }
    
        mail.Move(foundFolder.Id);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2011-05-04
      • 2019-09-21
      • 2017-05-20
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多