Конвертация OLM в PST

Конвертировать OLM в PST

OLM (Outlook for Mac) — это файловый формат, используемый Microsoft Outlook для Mac для хранения электронных писем, контактов, календарей, задач и других данных. Это родной формат файла для Outlook для Mac, поэтому открыть файл OLM в Outlook для Windows невозможно. Для работы с файлами OLM в Windows Aspose Email предоставляет инструменты, специально разработанные для обработки OLM‑файлов. Они конвертируют OLM‑файлы в формат PST (Outlook Data File), который широко поддерживается в Windows‑среде. После конвертации в PST вы можете импортировать данные в Outlook для Windows или любой другой совместимый почтовый клиент.

Основной подход

Следующий пример кода демонстрирует, как конвертировать файл Outlook OLM в PST, используя библиотеку Aspose.Email. Он читает каждую папку и соответствующие сообщения из файла OLM и добавляет их в новый PST‑файл в том же порядке.

  1. Создать экземпляр OlmStorage класс для открытия исходного файла OLM.
  2. Используйте PersonalStorage.create метод для создания нового PST-файла с указанным именем и версией формата.
  3. Рекурсивно считывайте каждую папку и её сообщения из файла OLM.
  4. Используйте функцию add_to_pst, чтобы добавить каждую папку и её сообщения в файл PST, сохраняя оригинальную структуру.

import aspose.email as ae

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

pst = ae.storage.pst.PersonalStorage.create("my.pst", ae.storage.pst.FileFormatVersion.UNICODE)

for folder in olm.folder_hierarchy:
    add_to_pst(pst.root_folder, folder)

Этот код представляет собой основной скрипт для запуска процесса конвертации файла OLM в PST с использованием библиотеки aspose.email. Он демонстрирует, как открыть файл OLM, создать новый PST-файл и вызвать функцию add_to_pst для выполнения задачи переноса данных. Этот скрипт служит точкой входа в процесс миграции, эффективно используя функцию для детального переноса папок и сообщений.

Рекурсивный перенос папок и сообщений

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


def add_to_pst(pst_folder, olm_folder):
    pst_sub_folder = pst_folder.get_sub_folder(olm_folder.name)

    for msg in olm_folder.enumerate_mapi_messages():
        if pst_sub_folder is None:
            pst_sub_folder = pst_folder.add_sub_folder(olm_folder.name, get_container_class(msg.message_class))

        pst_sub_folder.add_message(msg)

    if pst_sub_folder is None:
        pst_sub_folder = pst_folder.add_sub_folder(olm_folder.name)

    for olm_sub_folder in olm_folder.sub_folders:
        add_to_pst(pst_sub_folder, olm_sub_folder)

Определение типов папок в PST

При конвертации файла OLM в PST необходимо обеспечить сохранность структуры папок и правильный тип каждой папки в файле PST. В отличие от PST, папки в OLM не имеют предопределённых типов. Чтобы правильно классифицировать и перенести данные, выполните следующие шаги:

  1. Прочитайте первое сообщение из папки OLM и определите его тип.
  2. Используйте этот тип сообщения для расчёта соответствующего типа папки в PST с помощью метода классификации.
  3. Создайте папку определённого типа в файле PST.
  4. Добавьте сообщение в только что созданную папку PST.

Для остальных сообщений в папке OLM мы предполагаем, что они относятся к той же категории, так как тип папки уже установлен.

Функция get_container_class помогает классифицировать элементы Outlook, сопоставляя различные классы сообщений с правильными типами папок PST:

def get_container_class(message_class):
    if message_class.startswith("IPM.Contact") or message_class.startswith("IPM.DistList"):
        return "IPF.Contact"

    if message_class.startswith("IPM.StickyNote"):
        return "IPF.StickyNote"

    if message_class.startswith("IPM.Activity"):
        return "IPF.Journal"

    if message_class.startswith("IPM.Task"):
        return "IPF.Task"

    if message_class.startswith("IPM.Appointment") or message_class.startswith("IPM.Schedule.meeting"):
        return "IPF.Appointment"

    return "IPF.Note"