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

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

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

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

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

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

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

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

При открытии и проверке папок внутри файла 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.

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

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

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