Como obtenho o tamanho da pasta com o Exchange Web Services 2010 Managed API?
-
24-09-2019 - |
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?
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.