Конвертувати 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"