Чтение файла Outlook PST и получение информации о папках и подпапках

Загрузка файла PST

Файл PST Outlook можно загрузить в экземпляр класса PersonalStorage. Ниже приведён фрагмент кода для загрузки файла PST:

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Load the Outlook PST file
PersonalStorage pst = PersonalStorage.fromFile(dataDir + "PersonalStorage.pst");

Отображение информации о папках

После загрузки файла PST в класс PersonalStorage вы можете получить информацию о отображаемом имени файла, корневой папке, количестве подпапок и сообщениях. Следующий фрагмент кода отображает имя файла PST, папки и количество сообщений в папках:

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Load the Outlook PST file
PersonalStorage pst = PersonalStorage.fromFile(dataDir + "PersonalStorage.pst");
// Get the folders information
FolderInfoCollection folderInfoCollection = pst.getRootFolder().getSubFolders();
// Browse through each folder to display folder name and number of messages
for (int i = 0; i < folderInfoCollection.size(); i++) {
FolderInfo folderInfo = (FolderInfo) folderInfoCollection.get_Item(i);
System.out.println("FolderId: " + folderInfo.getEntryIdString());
System.out.println("Folder: " + folderInfo.getDisplayName());
System.out.println("Total items: " + folderInfo.getContentCount());
System.out.println("Total unread items: " + folderInfo.getContentUnreadCount());
System.out.println("-----------------------------------");
}

Получить только пользовательские папки

Файлы PST/OST могут содержать папки, созданные пользователем. Aspose.Email предоставляет возможность получать только пользовательские папки, используя свойство PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser. Вы можете установить свойство PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser в true, чтобы получить только пользовательские папки. Следующий фрагмент кода демонстрирует использование PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser для получения пользовательских папок.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
PersonalStorage pst = PersonalStorage.fromFile(dataDir + "Outlook.pst");
try {
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getOnlyFoldersCreatedByUser().equals(true);
FolderInfoCollection subfolders = pst.getRootFolder().getSubFolders(queryBuilder.getQuery());
for(FolderInfo folder : subfolders) {
System.out.println(folder.getDisplayName());
}
} finally {
pst.dispose();
}

Проверка, является ли папка предопределённым типом папки

При открытии и проверке папок внутри файла PST (Личная таблица хранения) вы можете проверить, является ли каждая папка предопределённым типом папки или подпапкой предопределённого типа папки, и получить информацию о каждой папке.

Метод FolderInfo.getPredefinedType(boolean getForTopLevelParent) используется для проверки, является ли папка из StandardIpmFolder.

Если параметр ‘getForTopLevelParent’ равен true, метод возвращает значение перечисления StandardIpmFolder для родительской папки верхнего уровня. Это определяет, является ли текущая папка подпапкой предопределённой папки. Если параметр ‘getForTopLevelParent’ равен false, он возвращает значение перечисления StandardIpmFolder для текущей папки.

String fileName = "my.pst";

try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
    checkFolders(pst.getRootFolder().getSubFolders());
}

private void checkFolders(FolderInfoCollection folders) {
    for (FolderInfo folder : folders) {
        System.out.println("Отображаемое имя: " + folder.getDisplayName());

        // Определяет, является ли текущая папка предопределённым типом
        int folderType = folder.getPredefinedType(false);
        String answer = folderType == StandardIpmFolder.Unspecified ? "Нет" : "Да, " + folderType;
        System.out.println("Является ли StandardIpmFolder?: " + answer);

        // Определяет, является ли текущая папка подпапкой предопределённой папки
        if (folderType == StandardIpmFolder.Unspecified) {
            folderType = folder.getPredefinedType(true);
            answer = folderType == StandardIpmFolder.Unspecified ? "Нет" : "Да, " + folderType;
            System.out.println("Является ли подпапкой от StandardIpmFolder родителя?: " + answer);
        }

        System.out.println();

        checkFolders(folder.getSubFolders());
    }
}

Получить или добавить стандартную папку RSS-каналов в файл PST

Aspose.Email позволяет получать ссылку на предопределённую папку, содержащую RSS-каналы. Это может быть полезно, если вы хотите программно получить доступ и манипулировать RSS-каналами, хранящимися в файле PST Outlook. Установите значение RssFeeds для перечисления StandardIpmFolder.

Следующий пример кода показывает, как получить папку RSS-каналов:

try (PersonalStorage pst = PersonalStorage.fromFile("my.pst", false)) {
    FolderInfo rssFolder = pst.getPredefinedFolder(StandardIpmFolder.RssFeeds);
}

А следующий пример кода демонстрирует, как добавить папку RSS-каналов:

try (PersonalStorage pst = PersonalStorage.create("my.pst", FileFormatVersion.Unicode)) {
    FolderInfo rssFolder = pst.createPredefinedFolder("RSS Feeds", StandardIpmFolder.RssFeeds);
}

Парсить searchable папки

Файлы PST/OST могут содержать searchable папки в дополнение к нормальным типам папок. Aspose.Email предоставляет перечислитель FolderKind для указания сообщений из таких searchable папок с помощью методов EnumerateFolders и GetSubFolders.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
final PersonalStorage pst = PersonalStorage.fromFile(dataDir + "PersonalStorage.pst");
FolderInfo finder = pst.getFolderById("AAAAAOu+OWXNsrFFkK4GgGGmk0yCgAAA");
FolderInfoCollection coll = finder.getSubFolders(FolderKind.Search);
System.out.println(coll.size()); //This should print 17
coll = finder.getSubFolders(FolderKind.Normal);
System.out.println(coll.size()); //This should print 0
coll = finder.getSubFolders(FolderKind.Search | FolderKind.Normal);
System.out.println(coll.size()); //This should print 17

Получить информацию о родительской папке из MessageInfo

Следующий фрагмент кода показывает, как получить информацию о родительской папке из MessageInfo.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
final PersonalStorage[] pst = { PersonalStorage.fromFile(dataDir + "PersonalStorage.pst") };
try {
for (FolderInfo folder : (Iterable<FolderInfo>) pst[0].getRootFolder().getSubFolders()) {
for (MessageInfo msg : (Iterable<MessageInfo>) folder.enumerateMessages()) {
FolderInfo fi = pst[0].getParentFolder(msg.getEntryId());
}
}
} finally {
if (pst[0] != null)
((IDisposable) pst[0]).dispose();
}

API обхода файла PST

API обхода позволяет извлекать все элементы PST насколько это возможно, не вызывая исключений, даже если некоторые данные оригинального файла повреждены. Следующие шаги показывают, как использовать этот API.

Используйте конструктор PersonalStorage и метод load вместо метода fromFile.

Конструктор позволяет определить метод обратного вызова.

try (PersonalStorage currentPst = new PersonalStorage(new TraversalExceptionsCallback() {
    public void invoke(TraversalAsposeException exception, String itemId) {
        // Код обработки исключений.
    }
})) {
    //
}

Исключения при загрузке и обходе будут доступны через метод обратного вызова.

Метод load возвращает ‘true’, если файл был успешно загружен и дальнейший обход возможен. Если файл повреждён и дальнейший обход невозможен, возвращается ‘false’.

if (currentPst.load(inputStream))

Это позволяет открывать и обходить даже повреждённые файлы PST, не вызывая исключений. Как исключения, так и повреждённые элементы будут обрабатываться методом обратного вызова.

try (PersonalStorage pst = new PersonalStorage(new TraversalExceptionsCallback() {
    public void invoke(TraversalAsposeException exception, String itemId) {
        // Код обработки исключений.
    }
})) {
    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);
    }
}