La migrazione dei dati di posta elettronica da Outlook for Mac (OLM) a formati ampiamente supportati come MBOX (per le caselle di posta di Thunderbird / Unix) e PST (Outlook per Windows) è un’operazione comune quando si passa da una piattaforma all’altra. Microsoft Outlook per Mac utilizza il formato OLM (Outlook for Mac Data File) per archiviare email, contatti, calendari e altri elementi. Tuttavia, migrare questi dati in ambienti basati su Windows o in altri client di posta richiede spesso la conversione dei file OLM in formati universalmente supportati come MBOX (utilizzato da client come Thunderbird e Apple Mail) o PST (Outlook Personal Storage Table per Windows).
In questo articolo, ti mostreremo come convertire i file OLM in formati PST e MBOX in C# usando Aspose.Email for .NET, un’API potente che semplifica programmaticamente le complesse attività di migrazione della posta elettronica. Imparerai come aprire i file OLM, estrarre i messaggi, preservare le gerarchie delle cartelle e generare archivi di posta elettronica portatili per più piattaforme.
Utilizzo di Aspose.Email for .NET per la conversione
[Aspose.Email for .NET][] offre funzionalità complete per lavorare con vari formati di email, tra cui OLM, MBOX e PST. Semplifica le operazioni di conversione complesse grazie alla sua API intuitiva e alla documentazione estesa. Di seguito, illustreremo i passaggi per convertire OLM in MBOX e PST utilizzando C#.
Per iniziare, installa il pacchetto NuGet Aspose.Email nel tuo progetto .NET:
Install-Package Aspose.Email
Questo pacchetto include tutte le classi necessarie per gestire i file OLM, MBOX e PST.
Converti OLM in MBOX
Il formato MBOX memorizza i messaggi di posta elettronica come voci MIME concatenate, comunemente utilizzato dai client di posta elettronica open‑source. Di seguito è riportato un esempio di codice semplice ma efficiente per convertire tutti i messaggi da una cartella OLM in un file MBOX. Utilizza i seguenti membri dell’API:
- OlmStorage.FromFile(…) - Apre un archivio OLM e fornisce l’accesso alla sua struttura di cartelle e agli elementi. È possibile usarlo per elencare le cartelle o estrarre i messaggi da un file OLM.
- GetFolder(string name, bool ignoreCase) - Restituisce un OlmFolder per il nome della cartella richiesto.
- OlmFolder.EnumerateMapiMessages() - Itera gli elementi MapiMessage in quella cartella.
- MapiMessage.ToMailMessage(MailConversionOptions) - Converte un MapiMessage in un MailMessage (MIME).
- MboxrdStorageWriter.WriteMessage(MailMessage) - Scrive un MailMessage MIME nello stream MBOX.
Passaggi
- Definire i percorsi dei file per il file OLM di input e il file MBOX di output.
- Aprire il file OLM usando
OlmStorage.FromFile. - Creare un writer MBOX usando
MboxrdStorageWritercon il percorso di output specificato e le opzioni. - Accedere alla cartella “Inbox” dal file OLM usando una ricerca case‑insensitive.
- Scorrere tutti i messaggi MAPI nella cartella “Inbox”.
- Convertire ogni messaggio MAPI in un oggetto
MailMessagestandard. - Scrivere ogni messaggio convertito nel file MBOX.
Esempio di codice
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);
}
}
Nota:
Se desideri un MBOX per ogni cartella, crea un writer separato per ciascuna cartella OLM.
Se preferisci un unico archivio, riutilizza la stessa istanza di MboxrdStorageWriter e chiama WriteMessage più volte come mostrato nell’esempio di codice sopra.
Converti OLM in PST
La conversione da OLM a PST richiede spesso non solo la copia dei messaggi, ma anche la ricreazione della gerarchia delle cartelle. Il campione di codice qui sotto dimostra come convertire e copiare la struttura delle cartelle e i messaggi da un file di archivio OLM di Outlook a un file PST Unicode utilizzando Aspose.Email for .NET.
Membri chiave
- PersonalStorage.Create(path, FileFormatVersion.Unicode) – Crea un nuovo file PST Unicode e restituisce un’istanza di PersonalStorage. Usa PersonalStorage.Load(…) per aprire PST esistenti. La classe PersonalStorage è il punto di ingresso per lavorare con i file PST.
- PersonalStorage.RootFolder – Fornisce la cartella radice FolderInfo del PST. Usa FolderInfo.AddSubFolder(name) per creare sottocartelle. FolderInfo.GetSubFolders() restituisce le cartelle figlie, così da poter verificare se esiste già una cartella con lo stesso nome.
- OlmStorage.GetFolders() – Restituisce la collezione di OlmFolder di livello superiore (la gerarchia delle cartelle OLM). La proprietà OlmFolder.SubFolders contiene le cartelle figlie (perciò è possibile scendere ricorsivamente).
- OlmFolder.EnumerateMapiMessages() – Restituisce istanze di MapiMessage.
- FolderInfo.AddMessage(MapiMessage) – Aggiunge un MapiMessage a una cartella PST.
Passaggi
- Imposta i percorsi dei file per il file OLM di origine e il file PST di destinazione.
- Apri l’archivio OLM in lettura e crea un nuovo file PST in scrittura.
- Recupera le cartelle di livello superiore dall’archivio OLM.
- Definisci una funzione di supporto per trovare o creare una cartella corrispondente all’interno del PST per un determinato nome di cartella.
- Definisci una funzione ricorsiva per:
- Creare o ottenere la cartella PST corrispondente a ciascuna cartella OLM.
- Copiare tutti i messaggi dalla cartella OLM alla cartella PST.
- Richiamare se stessa per ogni sottocartella della cartella OLM, mantenendo l’albero delle cartelle.
- Invoca la funzione ricorsiva su tutte le cartelle OLM di livello superiore, usando la cartella radice del PST come genitore.
- Salva l’intera gerarchia di cartelle e i messaggi nel nuovo file PST, preservando i dati MAPI.
Esempio di codice
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);
}
}
Importante: un PST appena creato include già per impostazione predefinita una cartella Posta eliminata — quindi fai attenzione a non duplicare le cartelle predefinite.
Nota:
Preservare i tipi di cartella: le sottocartelle OLM possono corrispondere a cartelle speciali di Outlook specifiche (Posta in arrivo, Posta inviata, Calendario). Se vuoi >creare cartelle IPM predefinite (in modo che Outlook le riconosca come cartelle standard), usa PersonalStorage.CreatePredefinedFolder o GetPredefinedFolder a seconda dello scenario. CreatePredefinedFolder restituisce un FolderInfo. Usa l’enumerazione StandardIpmFolder quando appropriato.
Prestazioni: AddMessages (aggiunta in blocco) è più veloce rispetto a molte chiamate a AddMessage. Considera di raccogliere i messaggi in lotti e usare FolderInfo.AddMessages(IEnumerable) per ridurre l’I/O su disco.
Conclusione
In questo articolo, abbiamo imparato come convertire i file Outlook per Mac (OLM) nei formati PST e MBOX in C# utilizzando Aspose.Email for .NET. Abbiamo esplorato come aprire e elaborare gli archivi OLM, estrarre i messaggi e preservare le gerarchie delle cartelle durante l’esportazione dei dati in nuovi formati di archiviazione della posta. Con l’API Aspose.Email, gli sviluppatori possono automatizzare facilmente le migrazioni di posta elettronica cross‑platform, garantendo la compatibilità tra Outlook per Mac, Outlook per Windows e client open‑source come Thunderbird.
Per ulteriori dettagli, consultare la documentazione di Aspose.Email e il riferimento API.
