Ler arquivos PST/OST corrompidos
Ler arquivos PST/OST corrompidos
Às vezes pode não ser possível ler o PST/OST devido a alguns problemas. Por exemplo, alguns blocos de dados podem estar corrompidos. Nesses casos, exceções geralmente surgem ao chamar o EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. métodos. Mas mensagens ou pastas individuais podem permanecer intactas no armazenamento.
Os usuários do Aspose.Email podem encontrar identificadores de itens de forma hierárquica. Além disso, podem extrair itens pelos identificadores. Para isso, a biblioteca oferece os seguintes métodos:
- PersonalStorage.findMessages(String parentEntryId) - encontra os identificadores das mensagens para a pasta.
- PersonalStorage.findSubfolders(String parentEntryId) - encontra os identificadores das subpastas para a pasta.
Nota, que apesar das vantagens, existem armazenamentos corrompidos que não podem ser lidos mesmo usando esses métodos.
O trecho de código a seguir demonstra o uso desses métodos para ler arquivos PST/OST corrompidos:
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);
}
}
}
Extrair itens PST de arquivos corrompidos
A API de percorrimento permite extrair todos os itens PST tanto quanto possível, sem lançar exceções, mesmo se alguns dados do arquivo original estiverem corrompidos.
Use o PersonalStorage(TraversalExceptionsCallback callback) construtor e o load(String fileName) método ao invés do fromFile método.
O construtor permite definir um método de callback.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Exceções de carregamento e navegação estarão disponíveis através do método de callback.
O método load retorna ’true’ se o arquivo foi carregado com sucesso e o percorrimento adicional for possível. Se o arquivo estiver corrompido e nenhum percorrimento for possível, retorna ‘false’.
if (currentPst.load(inputStream))
O exemplo de código a seguir mostra como implementar a API de percorrimento de arquivos PST em um projeto:
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);
}
}