Konwersja OLM na PST

OLM jest formatem bazy danych używanym przez Microsoft Outlook dla Mac. Pliki OLM przechowują wiadomości e‑mail, dane kalendarza, kontakty i ustawienia aplikacji, i nie są obsługiwane przez Outlook dla Windows. Aby przenieść skrzynkę pocztową z Outlooka dla Mac do Outlooka dla Windows, trzeba skonwertować plik OLM na format Outlooka PST format. Aspose.Email dla .NET umożliwia to w kodzie, bez konieczności instalacji Microsoft Outlook.

Jak działa konwersja

Aby przekonwertować plik OLM na PST, wykonaj następujące kroki:

  1. Utwórz instancję OlmStorage klasa otwierająca źródłowy plik OLM.
  2. Utwórz nowy plik PST przy użyciu PersonalStorage.Create metoda.
  3. Zaimplementuj GetContainerClass metodę mapującą klasę wiadomości na odpowiadającą jej klasę folderu (kontenera), tak aby każdy folder został utworzony z właściwym typem w PST.
  4. Zaimplementuj AddToPst metody, która rekurencyjnie odczytuje każdy folder i jego wiadomości z pliku OLM – przy użyciu EnumerateMapiMessages - i dodaje je do PST w tej samej kolejności, używając AddSubFolder i AddMessage metod klasy FolderInfo.

Przykład kodu

Poniższy kod pokazuje, jak przekonwertować plik OLM na PST.

Metoda 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);
    }
}

Metodę 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";
}

Metodę 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);
    }
}