C# MS Exchange移动邮件到文件夹

8

新增:感谢用户 @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“已知”的文件夹(草稿、垃圾邮件等),这对于我创建的文件夹是无效的。

3个回答

11

问题解决了!

尝试多次后,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);
        }
    }
}

1
如果你的代码要上线,那么获取“Example”文件夹时,你真的应该使用过滤器。即使没有过滤器,你也应该将FindItems移出循环,因为重复获取相同的项目100次有什么意义呢?ExchangeService类中还有MoveItems方法,可以在一次调用中移动多个项目。所以基本上你的代码只需要3-4行(当然不包括安全if等)。 - grapkulec
1
谢谢,这段代码可以工作,并且可以进行微调以进行适当的调整。 - Kprof

8

看起来您正在使用EWS Managed API,所以这里是我的答案,我如何做这样的事情。

项目上的移动方法可以接受WellKnownFolderName或文件夹ID。如果我理解正确,您想将电子邮件移动到名为“Example”的文件夹中。因此,首先需要获取此文件夹的文件夹对象:

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));

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

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


不幸的是,这会生成多个重载错误,因此它与当前代码不兼容。 - Kprof
@Peroxy,到底是什么出了问题?“它不工作”这样的话我会期望从客户那里听到,而不是从同事开发者那里听到 :) - grapkulec
1
如OP所述:不幸的是,这会生成多个重载错误,因此它与当前代码不兼容。 - Peroxy
很奇怪,因为我多年来都没有碰过将项目移动到文件夹的代码,而且我们也在使用截至目前最新发布的EWS 2.2,所以...是的,很奇怪。 - grapkulec
请注意:在 Microsoft.Exchange.WebServices 的 2.2.0 版本中,FindFolders() 方法只有 4 种重载形式,所有形式的第一个参数都是 FolderIdWellKnownFolderName - CarenRose
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接