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“众所周知”的文件夹(草稿、垃圾邮件等),它不适用于我创建的文件夹。

4

3 回答 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);
        }
    }
}
于 2012-12-04T17:11:09.757 回答
8

看来您正在使用 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 对象,您必须通过搜索和/或绑定自行检索任何其他内容。

于 2012-12-03T15:29:04.167 回答
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);
}
于 2017-04-10T11:26:52.700 回答