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

OLM (Outlook for Mac Archive) — это файловый формат, связанный с Microsoft Outlook for Mac. Он используется для архивирования и хранения электронных писем, контактов, элементов календаря, задач и других данных Outlook на компьютерах Mac. Файлы OLM служат в качестве резервной копии или формата архива, позволяя пользователям сохранять свои данные Outlook for Mac для будущего использования или миграции. Важно отметить, что файлы OLM специфичны для Outlook for Mac и не совместимы с форматом PST (Personal Storage Table), используемым Outlook на Windows. Если необходимо перенести данные Outlook между разными платформами, пригодятся инструменты конвертации. Aspose.Email предлагает такие инструменты, включая открытие, чтение и другие функции для работы с файлами OLM.

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

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

  • использование конструктора
  • используя статический метод ‘from_file’

Открытие файлов через конструктор

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

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)

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

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

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)

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

Вы можете визуализировать и отобразить иерархию папок, полученную из OLM‑файла, используя функцию ‘print_all_folders’. Она принимает свойство ‘folder_hierarchy’ класса OlmStorage класс и уровень отступа в качестве входных параметров, затем рекурсивно обходя иерархию, выводит название каждой папки с соответствующим отступом. Приведённый ниже пример кода демонстрирует, как использовать эту функцию для отображения иерархии папок OLM‑файла. Он выводит список всех папок в иерархическом порядке:

import aspose.email as ae


def print_all_folders(folder_hierarchy, indent):
    for folder in folder_hierarchy:
        print(f"{indent}{folder.name}")
        print_all_folders(folder.sub_folders, indent + "-")

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
print_all_folders(olm.folder_hierarchy, "")

Приведённый выше пример кода предназначен для отображения иерархии папок OLM‑файла с помощью рекурсивной функции в более структурированном и читаемом виде. Aspose.Email также позволяет напрямую обращаться к структуре папок OLM‑файла, используя метод ‘get_folders()’ класса OlmStorage класс.

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folders = olm.get_folders()

Также можно получить любую папку по имени. Следующий пример кода использует метод ‘get_folder(name, ignore_case)’ класса OlmStorage класс, принимающий название папки и параметр чувствительности к регистру для получения папки по её имени:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

Список писем

Приведённые ниже фрагменты кода демонстрируют, как использовать библиотеку Aspose.Email для чтения и извлечения тем писем из файла Outlook for Mac (OLM). OlmFolder класс, представляющий папку, имеет следующие методы для получения списка писем:

  • ’enumerate_messages()’ — перебирает каждое сообщение электронной почты в папке. Этот метод возвращает сообщения как экземпляры OlmMessageInfo класс, предоставляющий базовую информацию о каждом сообщении, такую как тема, отправитель, дата и т.д.
  • ’enumerate_mapi_messages()’ — также перебирает каждое сообщение электронной почты в папке, но в этом случае возвращает сообщения как экземпляры MapiMessage класс, представляющий сообщение электронной почты более подробно и специфично для MAPI. Он предоставляет доступ к широкому набору свойств и деталей сообщения, позволяя выполнять более продвинутую и специализированную обработку.

Использование метода EnumerateMessages

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    print(message_info.subject)

Использование метода EnumerateMapiMessages

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for msg in folder.enumerate_mapi_messages():
    msg.save(f"{msg.subject}.msg")

Другие полезные свойства

Другие полезные свойства OlmFolder класс:

  • ‘has_messages’ — получает значение, указывающее, содержит ли текущая папка сообщения.
  • ‘message_count’ — получает количество сообщений.
import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

if folder.has_messages:
   print(f"Message count: {folder.message_count}")

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

Вы можете получить информацию о времени последнего изменения сообщения электронной почты. Свойство ‘modified_date’ класса OlmMessageInfo класс представляет дату и время последнего изменения сообщения.

Вот пример, демонстрирующий использование свойства:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    modifiedDate = message_info.modified_date

Извлечение писем

Вы можете получить фактические данные MAPI‑сообщения из хранилища электронной почты. Метод ’extract_mapi_message(message_info)’ класса OlmStorage класс используется для извлечения MAPI‑сообщения из хранилища на основе предоставленного message_info.

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

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    msg = olm.extract_mapi_message(message_info)

Извлечение всех элементов из письма с использованием Traversal API

Вы можете извлечь все элементы из файла Outlook OLM насколько это возможно, не выбрасывая исключения, даже если некоторые данные оригинального файла повреждены. Для этого используйте OlmStorage(TraversalExceptionsCallback callback) конструктор и Load(string fileName) метод вместо метода FromFile. Конструктор позволяет задать метод обратного вызова.

using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))

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

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

if (olm.Load(fileName))

Ниже приведён фрагмент кода и шаги, показывающие, как использовать этот API:

  1. Создайте новый экземпляр OlmStorage класс, передавая обратный вызов для обработки исключений, возникших в процессе.
  2. Загрузите файл OLM, вызвав Load метод экземпляра OlmStorage.
  3. Если файл OLM успешно загружен, получите иерархию папок, вызвав GetFolders метод у экземпляра OlmStorage. Он возвращает список объектов OlmFolder.
  4. Вызовите метод ExtractItems, передавая экземпляр OlmStorage и список объектов OlmFolder.
  5. В методе ExtractItems пройдитесь по каждой папке в списке папок.
  6. Если папка содержит сообщения (электронные письма), выведите название папки в консоль, используя Console.WriteLine(folder).
  7. Итерируйтесь по сообщениям в текущей папке, вызывая метод EnumerateMessages у экземпляра OlmStorage, передавая текущую папку в качестве аргумента.
  8. Выведите тему каждого сообщения в консоль, используя Console.WriteLine(msg.Subject).
  9. Если у папки есть подпапки, рекурсивно вызовите метод ExtractItems снова, передавая экземпляр OlmStorage и подпапки текущей папки.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))
{
    if (olm.Load(fileName))
    {
        var folderHierarchy = olm.GetFolders();
        ExtractItems(olm, folderHierarchy);
    }
}

private static void ExtractItems(OlmStorage olm, List<OlmFolder> folders)
{
    foreach (var folder in folders)
    {
        if (folder.HasMessages)
        {
            Console.WriteLine(folder);

            foreach (var msg in olm.EnumerateMessages(folder))
            {
                Console.WriteLine(msg.Subject);
            }
        }

        if (folder.SubFolders.Count > 0)
        {
            ExtractItems(olm, folder.SubFolders);
        }
    }
}

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

Для доступа к данным MAPI‑сообщения можно использовать свойство ’entry_id’, чтобы получить уникальный идентификатор (Entry ID) сообщения с помощью OlmMessageInfo класс. Затем можно воспользоваться методом ’extract_mapi_message(id)’ класса OlmStorage класс, принимающий Entry ID в качестве параметра для получения MAPI‑сообщения, связанного с этим конкретным идентификатором. Пример кода ниже демонстрирует использование этих возможностей:


import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    msg = olm.extract_mapi_message(message_info.entry_id)

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

Вы также можете получить иерархический путь или расположение папки внутри Outlook OLM‑файла. Aspose.Email предоставляет свойство ‘path’ класса OlmFolder класс, возвращающий путь к папке. Пример кода ниже демонстрирует использование этого свойства:

import aspose.email as ae


def print_path(storage, folders):
    for folder in folders:
        # print the current folder path
        print(folder.path)

        if folder.sub_folders:
            print_path(storage, folder.sub_folders)


fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
print_path(olm, olm.folder_hierarchy)

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

Aspose.Email предоставляет возможность подсчитать общее количество электронных сообщений, содержащихся в конкретной папке Outlook OLM‑файла. Свойство ‘message_count’ класса OlmFolder класс возвращает количество всех элементов (сообщений) в конкретной папке OLM‑файла. Пример кода ниже демонстрирует использование этого свойства:

import aspose.email as ae


def print_message_count(folders):
    for folder in folders:
        print(f"Message Count [{folder.name}]: {folder.message_count}")


fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
print_message_count(olm.folder_hierarchy)

Получить общее количество элементов в OlmStorage

Метод ‘get_total_items_count()’ класса OlmStorage класс возвращает общее количество сообщений, содержащихся в OLM‑хранилище.

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
count = olm.get_total_items_count()

Получить цвета категорий Outlook

С помощью Aspose.Email вы можете легко извлекать и использовать цвета категорий, связанных с элементами Outlook, хранящимися в OLM‑файлах. OlmItemCategory класс позволяет получать имена категорий и их соответствующие цвета в шестнадцатеричном формате. OlmStorage класс содержит метод ‘GetCategories()’ для получения списка категорий из OLM‑хранилища. Реализуя приведенный ниже пример кода, вы сможете без труда извлечь все использованные категории из OML‑файла и получить название категории вместе с её цветом.

with OlmStorage.FromFile("storage.olm") as olm:
    categories = olm.GetCategories()
    
    for category in categories:
        print(f"Category name: {category.Name}")
        
        # Color is represented as a hexadecimal value: #rrggbb
        print(f"Category color: {category.Color}")

Кроме того, вы можете получить цвет категории, связанный с конкретными сообщениями, перебирая сообщения в папке и получая соответствующий цвет категории по её имени.

for msg in olm.EnumerateMessages(folder):
    if msg.Categories is not None:
        for msgCategory in msg.Categories:
            print(f"Category name: {msgCategory}")
            categoryColor = next((c.Color for c in categories if c.Name.lower() == msgCategory.lower()), None)
            if categoryColor is not None:
                print(f"Category color: {categoryColor}")