Pregunta

Estoy intentando utilizar EWS API 2010 logró que el tamaño total del buzón de un usuario. No he encontrado un método de servicio web para obtener estos datos, así que pensé que iba a tratar de calcularlo. He encontrado una pregunta aparentemente aplicable en otro sitio sobre la encontrar tamaño de los buzones con EWS 2007 , pero o bien no estoy entendiendo lo que me está pidiendo que haga, o que el método no funciona con el sistema de alerta temprana de 2010.

Noodling alrededor de la idea de código, yo era capaz de escribir lo que pensaba que era un método que atravesaría la estructura de carpetas de forma recursiva y el resultado en un total combinado de todas las carpetas dentro de la bandeja 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;
}

(supone que no hay más de 10.000 carpetas dentro de una carpeta determinada. Figura que es una apuesta segura ...)

Por desgracia, esto no funciona.

Estoy iniciando la recursividad con este código:

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

Sin embargo, una excepción de referencia nula se lanza, diciendo esencialmente que [folder].ManagedFolderInformation es una referencia de objeto nulo.

Para mayor claridad, que también intentó acaba de obtener el tamaño de la carpeta raíz:

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

Lo que arrojó la misma excepción NRE, así que sé que no se trata sólo de que una vez que llegue a una cierta profundidad en el árbol de directorios que ManagedFolderInformation no existe.

¿Alguna idea sobre cómo obtener el tamaño total del buzón del usuario? ¿Estoy ladrando al árbol equivocado?

¿Fue útil?

Solución

Uso del EWS Managad API, puede utilizar este código para obtener el tamaño de la carpeta acumulativa de un buzón de correo:

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

Otros consejos

El primer enlace es la forma en que desea ir. El puesto que describe las carpetas predeterminadas no se consideran "carpetas administradas", por lo que está recibiendo el NRE en la propiedad ManagedFolderInformation para algunas carpetas.

Lo que el mensaje está sugiriendo es agregar una propiedad extendida a la solicitud de las carpetas. Aquí está la página MSDN sobre cómo hacerlo que el uso de la API Gestionado.

He intentado encontrar un buen ejemplo, pero no subió con uno. Esto se debe apuntar en la dirección correcta. Si encuentro algo voy a actualizar mi respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top