Pergunta

Estou tentando usar a API gerenciada do EWS 2010 para obter o tamanho total da caixa de correio de um usuário. Não encontrei um método de serviço da web para obter esses dados, então imaginei que tentaria calculá -los. Eu encontrei uma pergunta aparentemente aplicável em outro site sobre Encontrando tamanhos de caixa de correio com EWS 2007, mas não estou entendendo o que está me pedindo para fazer, ou esse método simplesmente não funciona com o EWS 2010.

Noodling em torno do Code Insight, pude escrever o que pensei ser um método que atravessaria a estrutura da pasta recursivamente e resultaria em um total combinado para todas as pastas dentro da caixa de entrada:

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

(Assume que não há mais de 10.000 pastas dentro de uma determinada pasta. Figura que é uma aposta segura ...)

Infelizmente, isso não funciona.

Estou iniciando a recursão com este código:

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

Mas uma exceção de referência nula é jogada, essencialmente dizendo que [folder].ManagedFolderInformation é uma referência de objeto nulo.

Para maior clareza, também tentei obter o tamanho da pasta raiz:

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

O que lançou a mesma exceção do NRE, então eu sei que não é apenas que uma vez que você chega a uma certa profundidade na árvore do diretório que o gerente de informação não existe.

Alguma idéia de como obter o tamanho total da caixa de correio do usuário? Estou latindo na árvore errada?

Foi útil?

Solução

Usando a API do EWS Managad, você pode usar este código para obter o tamanho cumulativo da pasta de uma caixa de correio:

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

Outras dicas

O primeiro link é o jeito que você deseja ir. A postagem descreve que as pastas padrão não são consideradas "pastas gerenciadas", e é por isso que você está obtendo o NRE na propriedade ManagedFolderInformation para algumas pastas.

O que a postagem está sugerindo é adicionar uma propriedade estendida à solicitação de pastas. Aqui está a página do MSDN sobre como fazer isso usando a API gerenciada.

Tentei encontrar um bom exemplo, mas não criei um. Isso deve apontar na direção certa. Se eu encontrar alguma coisa, atualizarei minha resposta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top