تبدیل OLM به PST

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

نحوه کار تبدیل

برای تبدیل یک فایل OLM به PST، مراحل زیر را دنبال کنید:

  1. یک نمونه از OlmStorage کلاس برای باز کردن فایل OLM منبع.
  2. یک فایل PST جدید ایجاد کنید با PersonalStorage.Create متد.
  3. Implement a GetContainerClass متد که یک کلاس پیام را به کلاس پوشه (کانتینر) متناظر نگاشت می‌کند، به‌گونه‌ای که هر پوشه با نوع صحیح در PST ساخته شود.
  4. Implement an AddToPst متد که به‌صورت بازگشتی هر پوشه و پیام‌هایش را از فایل OLM می‌خواند - با استفاده از EnumerateMapiMessages - و آن‌ها را به‌همین ترتیب به PST اضافه می‌کند، با استفاده از AddSubFolder و AddMessage متدهای FolderInfo.

نمونه کد

کد زیر نشان می‌دهد چطور یک فایل OLM را به PST تبدیل کنید.

متد Main:

// create an instance of OlmStorage class to open the source OLM
using (var olm = new OlmStorage("my.olm"))
// create a new PST file
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
    // recursively read each folder and its messages
    // and add them to the PST in the same order
    foreach (var olmFolder in olm.FolderHierarchy)
    {
        AddToPst(pst.RootFolder, olmFolder);
    }
}

متد GetContainerClass:

public string GetContainerClass(string messageClass)
{
    if (messageClass.StartsWith("IPM.Contact") || messageClass.StartsWith("IPM.DistList"))
    {
        return "IPF.Contact";
    }

    if (messageClass.StartsWith("IPM.StickyNote"))
    {
        return "IPF.StickyNote";
    }

    if (messageClass.StartsWith("IPM.Activity"))
    {
        return "IPF.Journal";
    }

    if (messageClass.StartsWith("IPM.Task"))
    {
        return "IPF.Task";
    }

    if (messageClass.StartsWith("IPM.Appointment") || messageClass.StartsWith("IPM.Schedule.meeting"))
    {
        return "IPF.Appointment";
    }

    return "IPF.Note";
}

متد AddToPst:

public void AddToPst(FolderInfo pstFolder, OlmFolder olmFolder)
{
    FolderInfo pstSubFolder = pstFolder.GetSubFolder(olmFolder.Name);

    foreach (var msg in olmFolder.EnumerateMapiMessages())
    {
        if (pstSubFolder == null)
        {
            pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name, GetContainerClass(msg.MessageClass));
        }

        pstSubFolder.AddMessage(msg);
    }

    if (pstSubFolder == null)
    {
        pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name);
    }

    foreach (var olmSubFolder in olmFolder.SubFolders)
    {
        AddToPst(pstSubFolder, olmSubFolder);
    }
}