Как получить размер папки с управляемым API-интерфейсом Exchange Web Services 2010? - PullRequest
5 голосов
/ 02 апреля 2010

Я пытаюсь использовать EWS 2010 Managed API для получения общего размера почтового ящика пользователя. Я не нашел метод веб-службы для получения этих данных, поэтому я решил, что попытаюсь рассчитать их. На другом сайте я нашел один, казалось бы, применимый вопрос о поиске размеров почтовых ящиков с EWS 2007 , но либо я не понимаю, что он просит меня сделать, либо этот метод просто не работает с EWS 2010.

Обдумывая понимание кода, я смог написать, как мне показалось, метод, который рекурсивно пересекает структуру папок и приводит к объединенному итогу для всех папок внутри папки «Входящие»:

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 Reference, по сути говоря, [folder].ManagedFolderInformation является ссылкой на NULL.

Для ясности я также попытался просто получить размер корневой папки:

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

Это вызвало то же исключение NRE, поэтому я знаю, что не только после того, как вы достигнете определенной глубины в дереве каталогов, ManagedFolderInformation не существует.

Есть идеи, как получить общий размер почтового ящика пользователя? Я лаю не на том дереве?

Ответы [ 2 ]

9 голосов
/ 19 ноября 2011

Используя 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);
    }
}
1 голос
/ 05 мая 2010

Первая ссылка - путь, по которому вы хотите идти. В публикации описывается, что папки по умолчанию не считаются «управляемыми папками», поэтому вы получаете NRE для свойства ManagedFolderInformation для некоторых папок.

В сообщении предлагается добавить расширенное свойство к запросу на папки. Вот страница MSDN о том, как это сделать с помощью управляемого API.

Я пытался найти хороший пример, но не нашел его. Это должно указать вам в правильном направлении. Если я найду что-нибудь, я обновлю свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...