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