Migracja danych e‑mail z Outlook for Mac (OLM) do powszechnie obsługiwanych formatów, takich jak MBOX (dla Thunderbird / skrzynek pocztowych Unix) i PST (Outlook for Windows), jest częstym zadaniem przy przechodzeniu między platformami. Microsoft Outlook for Mac używa formatu OLM (Outlook for Mac Data File) do przechowywania wiadomości e‑mail, kontaktów, kalendarzy i innych elementów. Jednak migracja tych danych do środowisk opartych na Windows lub innych klientów poczty często wymaga konwersji plików OLM do uniwersalnie obsługiwanych formatów, takich jak MBOX (używany przez klientów takich jak Thunderbird i Apple Mail) lub PST (Outlook Personal Storage Table for Windows).
W tym artykule pokażemy, jak konwertować pliki OLM do formatów PST i MBOX w C# przy użyciu Aspose.Email for .NET, potężnego API, które upraszcza złożone zadania migracji poczty elektronicznej programowo. Dowiesz się, jak otwierać pliki OLM, wyodrębniać wiadomości, zachowywać hierarchię folderów oraz generować przenośne archiwa poczty dla wielu platform.
Używanie Aspose.Email for .NET do konwersji
[Aspose.Email for .NET][] zapewnia kompleksowe funkcje umożliwiające pracę z różnymi formatami e‑mail, w tym OLM, MBOX i PST. Ułatwia skomplikowane zadania konwersji dzięki intuicyjnemu interfejsowi API oraz obszernej dokumentacji. Poniżej przeprowadzimy Cię krok po kroku przez proces konwersji OLM do MBOX i PST przy użyciu C#.
Aby rozpocząć, zainstaluj pakiet NuGet Aspose.Email w swoim projekcie .NET:
Install-Package Aspose.Email
Ten pakiet zawiera wszystkie niezbędne klasy do obsługi plików OLM, MBOX i PST.
Konwertuj OLM do MBOX
Format MBOX przechowuje wiadomości e‑mail jako połączone wpisy MIME, powszechnie używany przez otwarto‑źródłowe klienty poczty. Poniżej znajduje się prosty, ale wydajny przykład kodu konwertującego wszystkie wiadomości z folderu OLM do pliku MBOX. Wykorzystuje on następujące elementy API:
- OlmStorage.FromFile(…) - Otwiera archiwum OLM i zapewnia dostęp do jego drzewa folderów oraz elementów. Można go używać do wyliczania folderów lub wyodrębniania wiadomości z pliku OLM.
- GetFolder(string name, bool ignoreCase) - Zwraca OlmFolder dla żądanej nazwy folderu.
- OlmFolder.EnumerateMapiMessages() - Iteruje elementy MapiMessage w tym folderze.
- MapiMessage.ToMailMessage(MailConversionOptions) - Konwertuje MapiMessage na MailMessage (MIME).
- MboxrdStorageWriter.WriteMessage(MailMessage) - Zapisuje wiadomość MIME MailMessage do strumienia MBOX.
Kroki
- Zdefiniuj ścieżki plików dla pliku OLM wejściowego i pliku MBOX wyjściowego.
- Otwórz plik OLM przy użyciu
OlmStorage.FromFile. - Utwórz zapisujący MBOX przy użyciu
MboxrdStorageWriterz określoną ścieżką wyjściową i opcjami. - Uzyskaj dostęp do folderu “Inbox” w pliku OLM, używając wyszukiwania bez uwzględniania wielkości liter.
- Przejdź przez wszystkie wiadomości MAPI w folderze “Inbox”.
- Przekonwertuj każdą wiadomość MAPI na standardowy obiekt
MailMessage. - Zapisz każdą przekonwertowaną wiadomość do pliku MBOX.
Przykład kodu
var olmPath = @"C:\data\archive.olm";
var mboxPath = @"C:\data\output.mbox";
// Load OLM file using OlmStorage
using (var olm = OlmStorage.FromFile(olmPath))
using (var mboxWriter = new MboxrdStorageWriter(mboxPath, new MboxSaveOptions()))
{
// Get the folder (case-insensitive example)
var inbox = olm.GetFolder("Inbox", true);
// Iterate MAPI messages (returns MapiMessage objects)
foreach (MapiMessage mapi in inbox.EnumerateMapiMessages())
{
// Convert to MailMessage and write to MBOX
var mail = mapi.ToMailMessage(new MailConversionOptions());
mboxWriter.WriteMessage(mail);
}
}
Uwaga: Jeśli chcesz mieć jeden plik MBOX na folder, utwórz osobny writer dla każdego folderu OLM.
Jeśli wolisz pojedynczy archiwum, ponownie użyj jednej instancji MboxrdStorageWriter i wywołuj WriteMessage wielokrotnie, jak pokazano w powyższym przykładzie kodu.
Konwertuj OLM do PST
Konwersja OLM do PST często wymaga nie tylko kopiowania wiadomości, ale także odtworzenia hierarchii folderów. Poniższy przykład kodu demonstruje, jak przekonwertować i skopiować strukturę folderów oraz wiadomości z archiwum Outlook OLM do pliku Unicode PST przy użyciu Aspose.Email for .NET.
Kluczowe elementy
- PersonalStorage.Create(path, FileFormatVersion.Unicode) – Tworzy nowy plik PST w formacie Unicode i zwraca instancję PersonalStorage. Użyj PersonalStorage.Load(…) aby otworzyć istniejące pliki PST. Klasa PersonalStorage jest punktem wejścia do pracy z plikami PST.
- PersonalStorage.RootFolder – Zwraca główny FolderInfo dla PST. Użyj FolderInfo.AddSubFolder(name) aby utworzyć podfoldery. FolderInfo.GetSubFolders() zwraca elementy podrzędne, dzięki czemu możesz sprawdzić, czy folder o tej samej nazwie już istnieje.
- OlmStorage.GetFolders() – Zwraca kolekcję OlmFolder najwyższego poziomu (hierarchia folderów OLM). Właściwość OlmFolder.SubFolders zawiera elementy podrzędne (co umożliwia rekurencyjne przeglądanie).
- OlmFolder.EnumerateMapiMessages() – Zwraca (generuje) instancje MapiMessage.
- FolderInfo.AddMessage(MapiMessage) – Dodaje MapiMessage do folderu PST.
Kroki
- Ustaw ścieżki plików dla źródłowego pliku OLM i docelowego pliku PST.
- Otwórz archiwum OLM do odczytu i utwórz nowy plik PST do zapisu.
- Pobierz foldery najwyższego poziomu z archiwum OLM.
- Zdefiniuj funkcję pomocniczą, która znajdzie lub utworzy pasujący folder w PST dla podanej nazwy folderu.
- Zdefiniuj funkcję rekurencyjną, aby:
- Utworzyć lub uzyskać odpowiadający folder PST dla każdego folderu OLM.
- Skopiować wszystkie wiadomości z folderu OLM do folderu PST.
- Wywołać się ponownie dla każdego podfolderu w folderze OLM, aby zachować strukturę drzewa folderów.
- Wywołaj funkcję rekurencyjną dla wszystkich folderów najwyższego poziomu OLM, używając głównego folderu PST jako rodzica.
- Zapisz całą hierarchię folderów i wiadomości do nowego pliku PST, zachowując dane MAPI.
Przykład kodu
var olmPath = @"C:\data\archive.olm";
var pstPath = @"C:\data\output.pst";
// Create a new PST file
using (var olm = OlmStorage.FromFile(olmPath))
using (var pst = PersonalStorage.Create(pstPath, FileFormatVersion.Unicode))
{
// Get top-level folders in OLM
var rootFolders = olm.GetFolders();
// Helper: map OlmFolder -> FolderInfo in PST by recursively creating subfolders
FolderInfo GetOrCreatePstFolder(FolderInfo parentPstFolder, string folderName)
{
// Try to find existing subfolder (case-insensitive)
foreach (var sub in parentPstFolder.GetSubFolders())
{
if (string.Equals(sub.DisplayName, folderName, StringComparison.OrdinalIgnoreCase))
return sub;
}
// Create new subfolder
return parentPstFolder.AddSubFolder(folderName);
}
// Recursive traversal
void ProcessOlmFolder(OlmFolder olmFolder, FolderInfo pstParent)
{
// Create / get the corresponding PST folder
var pstFolder = GetOrCreatePstFolder(pstParent, olmFolder.Name);
// Copy messages: OlmFolder.EnumerateMapiMessages returns MapiMessage instances
foreach (var mapi in olmFolder.EnumerateMapiMessages())
{
// AddMessage preserves MAPI data into PST
pstFolder.AddMessage(mapi);
}
// Recurse into OLM subfolders (OlmFolder.SubFolders property)
foreach (var child in olmFolder.SubFolders)
{
ProcessOlmFolder(child, pstFolder);
}
}
// Note: PST.RootFolder exists; create top-level folders under it.
foreach (var top in rootFolders)
{
// Skip creating a duplicate for default PST root folder names if needed
ProcessOlmFolder(top, pst.RootFolder);
}
}
Ważne: nowo utworzony plik PST już domyślnie zawiera folder Deleted Items — więc należy uważać, aby nie zduplikować folderów domyślnych.
Uwaga:
Zachowanie typów folderów: Podfoldery OLM mogą odpowiadać określonym specjalnym folderom Outlook (Skrzynka odbiorcza, Wysłane, Kalendarz). Jeśli chcesz utworzyć wstępnie zdefiniowane foldery IPM (aby Outlook rozpoznawał je jako standardowe foldery), użyj PersonalStorage.CreatePredefinedFolder lub GetPredefinedFolder w zależności od scenariusza. CreatePredefinedFolder zwraca FolderInfo. Użyj wyliczenia StandardIpmFolder w odpowiednich przypadkach.
Wydajność: AddMessages (dodawanie hurtowe) jest szybsze niż wiele wywołań AddMessage. Rozważ zbieranie wiadomości w partie i użycie FolderInfo.AddMessages(IEnumerable) w celu zmniejszenia operacji I/O na dysku.
Podsumowanie
W tym artykule dowiedzieliśmy się, jak konwertować pliki Outlook for Mac (OLM) na formaty PST i MBOX w C# przy użyciu Aspose.Email for .NET. Zbadaliśmy, jak otwierać i przetwarzać archiwa OLM, wyodrębniać wiadomości oraz zachowywać hierarchię folderów podczas eksportu danych do nowych formatów przechowywania poczty. Dzięki Aspose.Email API programiści mogą łatwo automatyzować migracje poczty między platformami, zapewniając kompatybilność między Outlook for Mac, Outlook for Windows i klientami open‑source, takimi jak Thunderbird.
Aby uzyskać dalsze informacje, zapoznaj się z dokumentacją Aspose.Email oraz referencją API.
