Leggere file PST/OST corrotti

Leggi file PST/OST corrotti

Talvolta potrebbe non essere possibile leggere il PST/OST a causa di alcuni problemi. Ad esempio, alcuni blocchi di dati potrebbero essere corrotti. In tali casi, le eccezioni solitamente si verificano quando si chiama il EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, ecc. metodi. Ma singoli messaggi o cartelle potrebbero rimanere intatti nello storage.

Gli utenti di Aspose.Email possono trovare gli identificatori degli elementi in modo gerarchico. Inoltre, è possibile estrarre gli elementi tramite gli identificatori. A tale scopo, la libreria offre i seguenti metodi:

Nota, nonostante i vantaggi, esistono archivi corrotti che non possono essere letti nemmeno usando questi metodi.

Il seguente frammento di codice dimostra l’uso di questi metodi per leggere file PST/OST corrotti:

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

Estrai elementi PST da file corrotti

L’API di traversata consente di estrarre tutti gli elementi PST per quanto possibile, senza generare eccezioni, anche se alcuni dati del file originale sono corrotti.

Usa il PersonalStorage(TraversalExceptionsCallback callback) costruttore e il load(String fileName) metodo invece del fromFile metodo.

Il costruttore consente di definire un metodo di callback.

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

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

Le eccezioni di caricamento e attraversamento saranno disponibili tramite il metodo di callback.

Il metodo load restituisce ’true’ se il file è stato caricato correttamente e la traversata successiva è possibile. Se un file è corrotto e non è possibile effettuare la traversata, viene restituito ‘false’.

if (currentPst.load(inputStream))

Il seguente esempio di codice mostra come implementare l’API di traversata dei file PST in un progetto:

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