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

Открытие файлов формата OLM

Файлы формата OLM можно открывать двумя способами:

  • с использованием конструктора
  • с использованием статического метода FromFile

Существуют различия в поведении между этими методами. Смотрите раздел ниже.

Открытие файлов с помощью конструктора

Чтобы открыть файл, вызовите конструктор класса OlmStorage и передайте полное имя файла или поток в качестве аргумента:

OlmStorage olm = new OlmStorage("fileName");

Открытие файлов с использованием статического метода FromFile

Чтобы открыть файл, используйте статический метод fromFile и передайте полное имя файла в качестве аргумента:

OlmStorage olm = OlmStorage.fromFile("fileName");

Открытие файлов с использованием статического метода FromStream

Чтобы открыть файл, используя статический метод fromStream, передайте имя потока в качестве аргумента:

Чтение файла OLM

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

Получение папок

Чтобы извлечь папки из файла OLM (Outlook для Mac), сначала загрузите его с помощью класса OlmStorage, а затем используйте один из следующих методов в зависимости от ваших потребностей:

Пример кода ниже покажет, как получить папку из файла OLM:

// Получаем папку по имени
OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

} finally {

    olm.dispose();

}

При использовании метода fromFile для открытия файла OLM метод getFolderHierarchy() вернет null. В этом случае вызовите метод getFolders() явно, чтобы получить список каталогов в файле OLM.

Получение пути к папке

Вы также можете получить путь к папке в файле OLM. Aspose.Email предоставляет свойство OlmFolder.Path которое возвращает путь к папке. Следующий код демонстрирует использование свойства OlmFolder.Path для получения путей к папкам в файле OLM.

Подсчет количества элементов в папке

Вы также можете подсчитать количество элементов в папке. Aspose.Email предоставляет свойство OlmFolder.MessageCount которое возвращает количество элементов в папке. Следующий код демонстрирует использование свойства OlmFolder.MessageCount для получения количества элементов в папках файла OLM.

Перечисление сообщений из заданной папки

Aspose.Email предоставляет API для работы с хранилищами OLM и извлечения сообщений из заданной папки. Классы OlmFolder и OlmMessageInfo представляют собой краткую информацию о папке и сообщении в хранилище соответственно. Класс OlmFolder предоставляет следующие методы:

  • OlmFolder.getSubFolder(String subfolderName, boolean ignoreCase) - Получает подпапку по имени.

  • OlmFolder.enumerateMapiMessages() - Предоставляет перечислитель, который поддерживает итерацию MapiMessages в текущей папке.

  • OlmFolder.enumerateMessages() - Предоставляет перечислитель, который поддерживает итерацию OlmMessageInfo в текущей папке.

  • OlmFolder.enumerateMessages(int startIndex, int count) - Предоставляет перечислитель, который поддерживает итерацию OlmMessageInfo в заданном диапазоне.

  • OlmFolder.enumerateMessages(MailQuery query) - Предоставляет перечислитель, который поддерживает итерацию OlmMessageInfo по критериям поиска.

Примеры кода ниже демонстрируют использование этих методов:

 // Перечисляет все сообщения в заданной папке

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages()) {

        System.out.println(messageInfo.getSubject());

   }

} finally {

    olm.dispose();

}

// Перечисляет диапазон сообщений в заданной папке

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

   int startIndex = 10;

   int count = 100;

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages(startIndex, count)) {

        System.out.println(messageInfo.getSubject());

   }

} finally {

    olm.dispose();

}

// Перечисляет сообщения по критериям поиска

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

    MailQueryBuilder mailQueryBuilder = new MailQueryBuilder();

    mailQueryBuilder.getSubject().contains("invitation");

    mailQueryBuilder.getFrom().contains("Mark");

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages(mailQueryBuilder.getQuery())) {

        System.out.println(messageInfo.getSubject());

   }

} finally {

    olm.dispose();

}

// Перечисляет все сообщения и извлечение некоторых из них

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages()) {

       if (messageInfo.hasAttachments()) {

            MapiMessage msg = olm.extractMapiMessage(messageInfo);

       }

   }

} finally {

    olm.dispose();

}

Извлечение сообщений из OLM по идентификаторам

Иногда требуется извлекать выбранные сообщения по идентификаторам. Например, ваше приложение хранит идентификаторы в базе данных и извлекает сообщение по запросу. Это эффективный способ избежать обхода всего хранилища каждый раз для поиска конкретного сообщения для извлечения. Для реализации этой функции для файлов OLM Aspose.Email предоставляет следующие методы и классы:

Пример кода ниже демонстрирует, как извлечь сообщения из OLM по идентификаторам:

for (OlmMessageInfo msgInfo : olmFolder.enumerateMessages()) {
    MapiMessage msg = storage.extractMapiMessage(msgInfo.getEntryId());
}

Примечание: Идентификатор сообщения уникален в пределах файла хранилища. Идентификаторы создаются Aspose.Email и не могут быть использованы в других сторонних библиотеках или приложениях для обработки OLM.

Извлечение элементов OLM из поврежденных файлов

Aspose.Email предоставляет API обхода, который позволяет извлекать все элементы OLM, насколько это возможно, не выбрасывая исключения, даже если некоторые данные оригинального файла повреждены.

Используйте конструктор OlmStorage(TraversalExceptionsCallback callback) и метод load(String fileName) вместо метода fromFile.

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

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

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

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

TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
    public void invoke(TraversalAsposeException exception, String itemId) {
        /* Код обработки исключений. */
    }
};
try (OlmStorage olm = new OlmStorage(exceptionsCallback)) {
    if (olm.load(fileName)) {
        List<OlmFolder> folderHierarchy = olm.getFolders();
        extractItems(olm, folderHierarchy);
    }
}

private static void extractItems(OlmStorage olm, List<OlmFolder> folders) {
    for (OlmFolder folder : folders) {
        if (folder.hasMessages()) {
            System.out.println(folder);

            for (MapiMessage msg : olm.enumerateMessages(folder)) {
                System.out.println(msg.getSubject());
            }
        }

        if (folder.getSubFolders().size() > 0) {
            extractItems(olm, folder.getSubFolders());
        }
    }
}

Получение даты изменения сообщения

Свойство OlmMessageInfo.getModifiedDate позволяет получить дату изменения сообщения.

for (OlmMessageInfo messageInfo : inboxFolder.enumerateMessages()) {
    Date modifiedDate = messageInfo.getModifiedDate();
}