تبدیل OLM به PST

تبدیل OLM به PST

OLM (Outlook for Mac) فرمت فایلی است که توسط Microsoft Outlook برای مک استفاده می‌شود تا پیام‌های ایمیل، مخاطبین، تقویم‌ها، وظایف و سایر داده‌ها را ذخیره کند. این فرمت بومی Outlook برای مک است، بنابراین امکان باز کردن فایل OLM در Outlook برای ویندوز وجود ندارد. برای کار با فایل‌های OLM در ویندوز، Aspose Email ابزارهایی مخصوص برای پردازش فایل‌های OLM ارائه می‌دهد. رویکرد این ابزارها تبدیل فایل‌های OLM به فرمت PST (Outlook Data File) است که به‌صورت گسترده‌ای در محیط‌های ویندوز پشتیبانی می‌شود. پس از تبدیل به فرمت PST، می‌توانید داده‌ها را به Outlook برای ویندوز یا هر کلاینت ایمیل سازگار دیگری وارد کنید.

رویکرد اصلی

نمونه کد زیر نشان می‌دهد چگونه یک فایل OLM Outlook را با استفاده از کتابخانه Aspose.Email به فایل PST تبدیل کنید. این کد هر پوشه و پیام‌های مربوطه را از فایل 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"