La migración de datos de correo electrónico desde Outlook for Mac (OLM) a formatos ampliamente compatibles como MBOX (para buzones de Thunderbird / Unix) y PST (Outlook para Windows) es una tarea común al cambiar entre plataformas. Microsoft Outlook for Mac utiliza el formato OLM (Outlook for Mac Data File) para almacenar correos electrónicos, contactos, calendarios y otros elementos. Sin embargo, migrar estos datos a entornos basados en Windows u otros clientes de correo a menudo requiere convertir los archivos OLM a formatos universalmente compatibles como MBOX (utilizado por clientes como Thunderbird y Apple Mail) o PST (Outlook Personal Storage Table para Windows).
En este artículo, le mostraremos cómo convertir archivos OLM a formatos PST y MBOX en C# usando Aspose.Email for .NET, una API potente que simplifica programáticamente tareas complejas de migración de correo electrónico. Aprenderá a abrir archivos OLM, extraer mensajes, preservar la jerarquía de carpetas y generar archivos de correo portátiles para múltiples plataformas.
Uso de Aspose.Email for .NET para la conversión
[Aspose.Email for .NET][] proporciona funciones integrales para trabajar con varios formatos de correo electrónico, incluidos OLM, MBOX y PST. Simplifica tareas de conversión complejas con su API intuitiva y documentación extensa. A continuación, recorreremos los pasos para convertir OLM a MBOX y PST usando C#.
Para comenzar, instale el paquete NuGet Aspose.Email en su proyecto .NET:
Install-Package Aspose.Email
Este paquete incluye todas las clases necesarias para manejar archivos OLM, MBOX y PST.
Convertir OLM a MBOX
El formato MBOX almacena los mensajes de correo electrónico como entradas MIME concatenadas, y se usa comúnmente en clientes de correo de código abierto. A continuación se muestra un ejemplo de código simple pero eficiente para convertir todos los mensajes de una carpeta OLM en un archivo MBOX. Utiliza los siguientes miembros de la API:
- OlmStorage.FromFile(…) - Abre un archivo OLM y le brinda acceso a su árbol de carpetas y elementos. Puede usarlo para enumerar carpetas o extraer mensajes de un archivo OLM.
- GetFolder(string name, bool ignoreCase) - Devuelve un OlmFolder para el nombre de carpeta solicitado.
- OlmFolder.EnumerateMapiMessages() - Itera los elementos MapiMessage en esa carpeta.
- MapiMessage.ToMailMessage(MailConversionOptions) - Convierte un MapiMessage en un MailMessage (MIME).
- MboxrdStorageWriter.WriteMessage(MailMessage) - Escribe un MailMessage MIME en el flujo MBOX.
Pasos
- Defina las rutas de archivo para el archivo OLM de entrada y el archivo MBOX de salida.
- Abra el archivo OLM usando
OlmStorage.FromFile. - Cree un escritor MBOX usando
MboxrdStorageWritercon la ruta de salida especificada y las opciones. - Acceda a la carpeta “Inbox” del archivo OLM usando una búsqueda que no distinga mayúsculas y minúsculas.
- Recorra todos los mensajes MAPI en la carpeta “Inbox”.
- Convierta cada mensaje MAPI a un objeto
MailMessageestándar. - Escriba cada mensaje convertido en el archivo MBOX.
Ejemplo de código
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: Si deseas un MBOX por carpeta, crea un escritor separado para cada carpeta OLM. Si prefieres un solo archivo, reutiliza una instancia de MboxrdStorageWriter y llama a WriteMessage repetidamente como se muestra en el ejemplo de código anterior.
Convertir OLM a PST
Convertir OLM a PST a menudo requiere no solo copiar los mensajes sino también recrear la jerarquía de carpetas. El ejemplo de código a continuación muestra cómo convertir y copiar la estructura de carpetas y los mensajes de un archivo de archivo OLM de Outlook a un archivo PST Unicode usando Aspose.Email for .NET.
Miembros clave
- PersonalStorage.Create(path, FileFormatVersion.Unicode) - Crea un nuevo archivo PST Unicode y devuelve una instancia de PersonalStorage. Usa PersonalStorage.Load(…) para abrir PST existentes. La clase PersonalStorage es el punto de entrada para trabajar con archivos PST.
- PersonalStorage.RootFolder - Te proporciona la carpeta raíz FolderInfo del PST. Usa FolderInfo.AddSubFolder(name) para crear subcarpetas. FolderInfo.GetSubFolders() devuelve los hijos para que puedas comprobar si ya existe una carpeta con el mismo nombre.
- OlmStorage.GetFolders() - Devuelve la colección de OlmFolder de nivel superior (la jerarquía de carpetas OLM). La propiedad OlmFolder.SubFolders contiene los hijos (para que puedas descender recursivamente).
- OlmFolder.EnumerateMapiMessages() - Genera instancias de MapiMessage.
- FolderInfo.AddMessage(MapiMessage) - Añade un MapiMessage a una carpeta PST.
Pasos
- Establece las rutas de archivo para el archivo OLM de origen y el archivo PST de destino.
- Abre el archivo OLM para lectura y crea un nuevo archivo PST para escritura.
- Recupera las carpetas de nivel superior del archivo OLM.
- Define una función auxiliar para encontrar o crear una carpeta coincidente dentro del PST para un nombre de carpeta dado.
- Define una función recursiva para:
- Crear o obtener la carpeta PST correspondiente para cada carpeta OLM.
- Copiar todos los mensajes de la carpeta OLM a la carpeta PST.
- Llamarse a sí misma para cada subcarpeta en la carpeta OLM para mantener el árbol de carpetas.
- Llama a la función recursiva en todas las carpetas OLM de nivel superior, usando la carpeta raíz del PST como padre.
- Guarda toda la jerarquía de carpetas y los mensajes en el nuevo archivo PST, preservando los datos MAPI.
Ejemplo de código
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 recién creado ya incluye una carpeta Elementos eliminados de forma predeterminada — así que tenga cuidado de no duplicar las carpetas predeterminadas.
Nota:
Preservar tipos de carpetas: Las subcarpetas OLM pueden mapearse a carpetas especiales específicas de Outlook (Bandeja de entrada, Elementos enviados, Calendario). Si desea crear carpetas IPM predefinidas (para que Outlook las reconozca como carpetas estándar), use PersonalStorage.CreatePredefinedFolder o GetPredefinedFolder según el escenario. CreatePredefinedFolder devuelve un FolderInfo. Use el enumerado StandardIpmFolder cuando sea apropiado.
Rendimiento: AddMessages (agregado masivo) es más rápido que muchas llamadas a AddMessage. Considere recopilar los mensajes en lotes y usar FolderInfo.AddMessages(IEnumerable) para reducir la E/S de disco.
Conclusión
En este artículo, hemos aprendido cómo convertir archivos Outlook for Mac (OLM) a formatos PST y MBOX en C# usando Aspose.Email for .NET. Exploramos cómo abrir y procesar archivos OLM, extraer mensajes y preservar la jerarquía de carpetas al exportar los datos a nuevos formatos de almacenamiento de correo. Con la API de Aspose.Email, los desarrolladores pueden automatizar fácilmente las migraciones de correo electrónico entre plataformas, garantizando la compatibilidad entre Outlook for Mac, Outlook for Windows y clientes de código abierto como Thunderbird.
Para obtener más detalles, explore la documentación de Aspose.Email y la referencia de API.
