6

EWS 2010マネージAPIを使用して、ユーザーのメールボックスの合計サイズを取得しようとしています。このデータを取得するためのWebサービスメソッドが見つからなかったので、計算してみようと思いました。別のサイトで、EWS 2007でメールボックスのサイズを見つけることについて、当てはまると思われる質問を1つ見つけましたが、何を求められているのかわからないか、その方法がEWS2010では機能しません。

コードインサイトをいじくり回して、フォルダー構造を再帰的にトラバースし、受信トレイ内のすべてのフォルダーの合計を算出する方法だと思ったものを書くことができました。

private int traverseChildFoldersForSize(Folder f)
{
    int folderSizeSum = 0;
    if (f.ChildFolderCount > 0)
    {
        foreach (Folder c in f.FindFolders(new FolderView(10000)))
        {
            folderSizeSum += traverseChildFoldersForSize(c);
        }
    }

    folderSizeSum += (int)f.ManagedFolderInformation.FolderSize;

    return folderSizeSum;
}

(特定のフォルダー内に10,000を超えるフォルダーがないことを前提としています。これは安全な方法です...)

残念ながら、これは機能しません。

私はこのコードで再帰を開始しています:

Folder root = Folder.Bind(svc, WellKnownFolderName.Inbox);
int totalSize = traverseChildFoldersForSize(root);

しかし、Null参照例外がスローされます。これは、本質的に[folder].ManagedFolderInformationはnullオブジェクト参照であると言っています。

わかりやすくするために、ルートフォルダのサイズも取得しようとしました。

Console.Write(root.ManagedFolderInformation.FolderSize.ToString());

これは同じNRE例外をスローしたので、ディレクトリツリーの特定の深さに到達すると、ManagedFolderInformationが存在しないというだけではないことを私は知っています。

ユーザーのメールボックスの合計サイズを取得する方法について何かアイデアはありますか?私は間違った木を吠えていますか?

4

2 に答える 2

10

EWS Managad APiを使用すると、次のコードを使用して、メールボックスの累積フォルダーサイズを取得できます。

internal class Program
{
    private static readonly ExtendedPropertyDefinition PidTagMessageSizeExtended = new ExtendedPropertyDefinition(0xe08,
                                                                                                                  MapiPropertyType
                                                                                                                    .Long);

    public static void Main(string[] args)
    {
        var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1)
                      {Credentials = new NetworkCredential("mail", "pw!")};

        service.AutodiscoverUrl("mail", url => true);

        var offset = 0;
        const int pagesize = 12;
        long size = 0;

        FindFoldersResults folders;
        do
        {
            folders = service.FindFolders(WellKnownFolderName.MsgFolderRoot,
                                          new FolderView(pagesize, offset, OffsetBasePoint.Beginning)
                                          {
                                            Traversal = FolderTraversal.Deep,
                                            PropertySet =
                                                new PropertySet(BasePropertySet.IdOnly, PidTagMessageSizeExtended,
                                                                FolderSchema.DisplayName)
                                          });
            foreach (var folder in folders)
            {
                long folderSize;
                if (folder.TryGetProperty(PidTagMessageSizeExtended, out folderSize))
                {
                    Console.Out.WriteLine("{0}: {1:00.00} MB", folder.DisplayName, folderSize/1048576);
                    size += folderSize;
                }
            }
            offset += pagesize;
        } while (folders.MoreAvailable);
        Console.Out.WriteLine("size = {0:0.00} MB", size/1048576);
    }
}
于 2011-11-19T12:33:25.160 に答える
1

最初のリンクはあなたが行きたい方法です。投稿では、デフォルトのフォルダーは「管理フォルダー」とは見なされないため、一部のフォルダーのManagedFolderInformationプロパティでNREを取得していると説明されています。

投稿が示唆しているのは、フォルダのリクエストに拡張プロパティを追加することです。 これは、ManagedAPIを使用してこれを行う方法に関するMSDNページです。

良い例を見つけようとしましたが、思いつきませんでした。これはあなたを正しい方向に向けるはずです。何か見つけたら答えを更新します。

于 2010-05-05T02:45:27.210 に答える