@dmckinney, @aweech,
With Aspose.Email 21.8, you can extract all PST items without throwing out exceptions, even if some data of the original file is corrupted. Code snippet:
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
//Loading and traversal exceptions will be available through the callback method.
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback))
{
// ...
}
The PersonalStorage.Load
method returns ‘true’ if a file is loaded successfully and further traversal is possible. If the file is corrupted and no traversal is possible, ‘false’ is returned.
For this case, PST extraction could be implemented like this:
static Map<String, Exception> exceptions = new HashMap<String, Exception>();
public static void main(String[] args) {
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
exceptions.put(itemId, exception);
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) {
pst.load("erosenfeld.pst");
FolderInfo rootFolder = pst.getRootFolder();
extractFolder(pst, rootFolder, "out\\");
}
}
private static void extractFolder(PersonalStorage pst, FolderInfo folder, String outDirectory) {
System.out.println("Processing folder " + folder.getDisplayName());
int messageNumber = 0;
for (String messageEntryId : folder.enumerateMessagesEntryId()) {
String fileName = outDirectory + messageNumber;
System.out.println("Processing messageEntryId " + messageEntryId);
MapiMessage message = pst.extractMessage(messageEntryId);
if (!exceptions.containsKey(messageEntryId)) {
if ("IPM.Contact".equals(message.getMessageClass())) {
IMapiMessageItem item = message.toMapiMessageItem();
((MapiContact) item).save(fileName + ".vcf", 0);
} else {
message.save(fileName + ".msg", new MsgSaveOptions(MailMessageSaveType.getOutlookMessageFormat()));
}
messageNumber++;
}
}
for (FolderInfo subFolder : folder.getSubFolders()) {
extractFolder(pst, subFolder, outDirectory);
}
}
API Reference: TraversalExceptionsCallback Class, PersonalStorage Class