Leer archivos PST/OST corruptos

Leer archivos PST/OST corruptos

A veces puede no ser posible leer el PST/OST debido a ciertos problemas. Por ejemplo, algunos bloques de datos pueden estar corruptos. En tales casos, normalmente se generan excepciones al invocar el EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. métodos. Pero algunos mensajes o carpetas pueden permanecer sin daño en el almacén.

Los usuarios de Aspose.Email pueden encontrar identificadores de elementos de forma jerárquica. Además, pueden extraer elementos mediante sus identificadores. Con este fin, la biblioteca ofrece los siguientes métodos:

Nota, que a pesar de las ventajas, existen almacenes corruptos que no pueden leerse incluso usando estos métodos.

El siguiente fragmento de código demuestra el uso de estos métodos para leer archivos PST/OST corruptos:

try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
    exploreCorruptedPst(pst, pst.getRootFolder().getEntryIdString());
}

public static void exploreCorruptedPst(PersonalStorage pst, String rootFolderId) {
    Iterable<String> messageIdList = pst.findMessages(rootFolderId);

    for (String messageId : messageIdList) {
        try {
            MapiMessage msg = pst.extractMessage(messageId);
            System.out.println("- " + msg.getSubject());
        } catch (Exception e) {
            System.out.println("Message reading error. Entry id: " + messageId);
        }
    }

    Iterable<String> folderIdList = pst.findSubfolders(rootFolderId);

    for (String subFolderId : folderIdList) {
        if (subFolderId != rootFolderId) {
            try {
                FolderInfo subfolder = pst.getFolderById(subFolderId);
                System.out.println(subfolder.getDisplayName());
            } catch (Exception e) {
                System.out.println("Message reading error. Entry id: " + subFolderId);
            }

            exploreCorruptedPst(pst, subFolderId);
        }
    }
}

Extraer elementos PST de archivos corruptos

La API de recorrido permite extraer todos los elementos del PST tanto como sea posible, sin lanzar excepciones, incluso si algunos datos del archivo original están corruptos.

Utilice el PersonalStorage(TraversalExceptionsCallback callback) constructor y el load(String fileName) método en lugar del fromFile método.

El constructor permite definir un método de devolución de llamada.

TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
    @Override
    public void invoke(TraversalAsposeException exception, String itemId) {
        /* Exception handling  code. */
    }
};

try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }

Las excepciones de carga y recorrido estarán disponibles a través del método de devolución de llamada.

El método load devuelve ’true’ si el archivo se ha cargado correctamente y es posible continuar el recorrido. Si el archivo está corrupto y no se puede recorrer, se devuelve ‘false’.

if (currentPst.load(inputStream))

El siguiente ejemplo de código muestra cómo implementar la API de recorrido de archivos PST en un proyecto:

public static void main(String[] args) {
    TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
        @Override
        public void invoke(TraversalAsposeException exception, String itemId) {
            /* Exception handling  code. */
        }
    };

    try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) {
        if (pst.load("test.pst")) {
            getAllMessages(pst, pst.getRootFolder());
        }
    }
}

private static void getAllMessages(PersonalStorage pst, FolderInfo folder) {
    for (String messageEntryId : folder.enumerateMessagesEntryId()) {
        MapiMessage message = pst.extractMessage(messageEntryId);
    }
    for (FolderInfo subFolder : folder.getSubFolders()) {
        getAllMessages(pst, subFolder);
    }
}