【问题标题】:Exchange Web Service FolderId for a folder created by user用户创建的文件夹的 Exchange Web Service FolderId
【发布时间】:2017-02-11 10:37:54
【问题描述】:

我在 Exchange 邮箱中有一个文件夹,它是根的子级,由用户创建。

如何使用 EWS 托管 API 找到这样的文件夹?

我尝试使用深度遍历,但找不到文件夹。

编辑:这是我用来获取用户创建的文件夹的代码:

ExchangeService server = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
server.UseDefaultCredentials = true;
string configUrl = @"https://yourServerAddress.asmx";
server.Url = new Uri(configUrl);

// set View
FolderView view = new FolderView(100);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
view.PropertySet.Add(FolderSchema.DisplayName);
view.Traversal = FolderTraversal.Deep;

FindFoldersResults findFolderResults = server.FindFolders(WellKnownFolderName.Root, view);

// find specific folder
foreach (Folder f in findFolderResults)
{
    // show FolderId of the folder "test"
    if (f.DisplayName == "Test")
    {
        Console.WriteLine(f.Id);
    }
}

【问题讨论】:

  • 你应该从 MsgFolderRoot 而不是 Root 开始你的枚举,因为你还没有分页你枚举的结果只会返回邮箱中的前 100 个文件夹,一个典型的邮箱可以包含 1000+ 个文件夹,所以它如果你想枚举你的分页结果,这很重要。就像我发布的示例一样,使用 Searchfilter 过滤结果很容易。
  • 我的枚举只为 MsgFolderRoot 返回 25 个文件夹,为 Root 返回 45 个文件夹,两者都不包括用户创建的文件夹。我会尝试你的建议。

标签: c# exchangewebservices


【解决方案1】:

您应该在问题中包含您正在使用的代码,因为您可能只是有错误。我所做的是使用一个函数从字符串路径中找到文件夹,然后你可以像GetFolderFromPath(service, "mailbox@domain.com", "\\\folder1\Folder2") 这样调用它,例如:

internal static Folder GetFolderFromPath(ExchangeService service, String MailboxName, String FolderPath)
{
    FolderId folderid = new FolderId(WellKnownFolderName.MsgFolderRoot, MailboxName);
    Folder tfTargetFolder = Folder.Bind(service,folderid);
    PropertySet psPropset = new PropertySet(BasePropertySet.FirstClassProperties);
    String[] fldArray = FolderPath.Split('\\');

    for (Int32 lint = 1; lint < fldArray.Length; lint++)
    {
        FolderView fvFolderView = new FolderView(1);
        fvFolderView.PropertySet = psPropset;
        SearchFilter SfSearchFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, fldArray[lint]);
        FindFoldersResults findFolderResults = service.FindFolders(tfTargetFolder.Id, SfSearchFilter, fvFolderView);

        if (findFolderResults.TotalCount > 0)
        {
            foreach(Folder folder in findFolderResults.Folders)
            {
                tfTargetFolder = folder;
            }
        }
        else
        {
            tfTargetFolder = null;
            break;
        }
    }
    if (tfTargetFolder != null)
    {
        return tfTargetFolder;
    }
    else
    {
        throw new Exception("Folder Not found");
    }
}

【讨论】:

  • 谢谢格伦。我会尝试这段代码来获取我需要的文件夹
  • Glen 我尝试了这段代码,但在 Folder.Bind 上出现“访问被拒绝”错误。你知道为什么会出现这个错误及其解决方法吗?
  • 听起来您对底层邮箱没有正确的访问权限。确保您使用 Add-MailboxPermissions 授予对 TargetMailbox 的完全访问权限,否则您的代码将无法工作。
【解决方案2】:

显然,您的代码是正确的,但它不会让您访问交换严格。我遇到了同样的问题,只修复了这些行。

其实MS忽略了UseDefaultCredentials = true;

这可能是您没有登录交换服务器的原因。有关详细信息,请参阅 MS 文档here

使用这种方法:

var exchange = new MSEWS.ExchangeService(MSEWS.ExchangeVersion.Exchange2007_SP1);
// userid, password, and your network domain
exchange.Credentials = new MSEWS.WebCredentials(userName, password, domain);

exchange.AutodiscoverUrl("tushar.kapoor@bollywood.com");

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2011-12-09
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多