3

EWS を使用して、'Inbox\test\final' Exchange フォルダからアイテムを取得する必要があります。フォルダーは、上記のようにリテラル パスによって提供されます。この文字列をフォルダー名に分割し、必要なフォルダーを再帰的に検索できることはわかっていますが、文字列パスをフォルダー インスタンスまたはフォルダー ID に変換できるより最適な方法はありますか?

最新の EWS 2.0 アセンブリを使用しています。これらのアセンブリは役に立ちますか、それとも手動の再帰で立​​ち往生していますか?

4

4 に答える 4

2

Exchange Server は ですべてをマップするFolder.Idのが好きなので、探しているパスを見つける唯一の方法は、フォルダー名を調べることです。

フォルダー コレクション内のすべてのフォルダーを調べ、電子メール フォルダーのツリーを移動するパスを追跡するには、再帰関数を作成する必要があります。

探しているパスを追跡するには、別のパラメーターが必要です。

public static Folder GetPathFolder(ExchangeService service, FindFoldersResults results,
                                   string lookupPath, string currentPath)
{
    foreach (Folder folder in results)
    {
        string path = currentPath + @"\" + folder.DisplayName;
        if (folder.DisplayName == "Calendar")
        {
            continue;
        }

        Console.WriteLine(path);

        FolderView view = new FolderView(50);
        SearchFilter filter = new SearchFilter.IsEqualTo(FolderSchema.Id, folder.Id);
        FindFoldersResults folderResults = service.FindFolders(folder.Id, view);
        Folder result = GetPathFolder(service, folderResults, lookupPath, path);
        if (result != null)
        {
            return result;
        }

        string[] pathSplitForward = path.Split(new[] {  "/" }, StringSplitOptions.RemoveEmptyEntries);
        string[] pathSplitBack    = path.Split(new[] { @"\" }, StringSplitOptions.RemoveEmptyEntries);
        string[] lookupPathSplitForward = lookupPath.Split(new[] {  "/" }, StringSplitOptions.RemoveEmptyEntries);
        string[] lookupPathSplitBack    = lookupPath.Split(new[] { @"\" }, StringSplitOptions.RemoveEmptyEntries);

        if (ArraysEqual(pathSplitForward, lookupPathSplitForward) || 
            ArraysEqual(pathSplitBack,    lookupPathSplitBack) || 
            ArraysEqual(pathSplitForward, lookupPathSplitBack) || 
            ArraysEqual(pathSplitBack,    lookupPathSplitForward))
        {
            return folder;
        }
    }
    return null;
}

" ArraysEqual":

public static bool ArraysEqual<T>(T[] a1, T[] a2)
{
    if (ReferenceEquals(a1, a2))
        return true;

    if (a1 == null || a2 == null)
        return false;

    if (a1.Length != a2.Length)
        return false;

    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    for (int i = 0; i < a1.Length; i++)
    {
        if (!comparer.Equals(a1[i], a2[i])) return false;
    }
    return true;
}

クライアントがスラッシュ、バックスラッシュ、スラッシュで始まるパスなどを入力する場合があるため、追加の配列チェックをすべて行います。彼らは技術に精通していないので、毎回プログラムが機能することを確認しましょう!

各ディレクトリを調べながら、目的のパスを反復パスと比較します。見つかったら、Folder現在存在するオブジェクトをバブルアップします。そのフォルダーの ID の検索フィルターを作成する必要があります。

FindItemsResults<item> results = service.FindItems(foundFolder.Id, searchFilter, view);

結果の電子メールをループします。

foreach (Item item in results) 
{
    // do something with item (email)
}
于 2015-09-03T20:23:45.020 に答える