Leer archivo OLM de Outlook para Mac y obtener información de carpetas y subcarpetas
OLM es un formato de archivo específico utilizado por Microsoft Outlook para almacenar datos locales como correos electrónicos, archivos adjuntos, notas, datos de calendario, contactos, tareas, historial y más. Los archivos OLM son compatibles únicamente con Outlook para Mac y no pueden ser abiertos o accedidos por Outlook para Windows, que utiliza el formato de archivo PST en su lugar.
Apertura de archivos en formato OLM
Los archivos en formato OLM se pueden abrir de dos maneras:
- utilizando el constructor
- utilizando el método estático FromFile
Existen diferencias en el comportamiento entre estos métodos. Consulte la sección a continuación.
Apertura de archivos por constructor
Para abrir un archivo, llame al constructor de la clase OlmStorage y pase el nombre completo del archivo o el flujo como argumento:
var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);
Apertura de archivos utilizando el método estático FromFile
Para abrir un archivo, utilice el método estático FromFile y pase el nombre completo del archivo o el flujo como argumento:
var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);
Obtención de carpetas
Para acceder a la estructura de directorios de un archivo OLM, cree una instancia de la clase OlmStorage usando su constructor y pase la ruta al archivo. Una vez que el archivo esté abierto, acceda a su estructura de directorios utilizando la propiedad FolderHierarchy. Esta propiedad devuelve una lista de objetos OlmFolder, cada uno representando un directorio en el archivo OLM. Para explorar aún más la estructura de directorios, acceda a la propiedad SubFolders de cada objeto, que devuelve una lista de sus subdirectorios. Al utilizar estas propiedades, puede navegar a través de toda la jerarquía de directorios del archivo OLM y acceder a todos los directorios y subdirectorios que contiene.
El siguiente ejemplo muestra la lista de todas las carpetas en orden jerárquico:
using (var olm = new OlmStorage(fileName))
{
PrintAllFolders(olm.FolderHierarchy, string.Empty);
}
private void PrintAllFolders(List<OlmFolder> folderHierarchy, string indent)
{
foreach (var folder in folderHierarchy)
{
Console.WriteLine($"{indent}{folder.Name}");
PrintAllFolders(folder.SubFolders, indent+"-");
}
}
Al utilizar el método FromFile para abrir un archivo OLM, la propiedad FolderHierarchy no se inicializará por defecto y devolverá null. En este caso, llame al método GetFolders explícitamente para inicializar la propiedad FolderHierarchy y recuperar la lista de directorios en el archivo OLM:
using (var olm = OlmStorage.FromFile(fileName))
{
var folders = olm.GetFolders();
}
También es posible obtener cualquier carpeta por nombre:
- Llame al método GetFolder.
- Pase el nombre de la carpeta como el primer argumento y un valor que indique si se debe ignorar la distinción entre mayúsculas y minúsculas al buscar una carpeta, como segundo parámetro.
using (var olm = OlmStorage.FromFile(fileName))
{
// obtener la carpeta de la bandeja de entrada por nombre
OlmFolder folder = olm.GetFolder("Inbox", true);
}
Lista de correos electrónicos
La clase OlmFolder que representa una carpeta tiene los siguientes métodos para obtener la lista de correos electrónicos:
- EnumerateMessages implementa la iteración de correos electrónicos en una carpeta. En este caso, cada iteración devuelve un objeto OlmMessageInfo que proporciona información breve sobre el correo electrónico.
- EnumerateMapiMessages, también implementa la iteración de correos electrónicos en una carpeta, pero en este caso, cada iteración devuelve un objeto MapiMessage que representa el correo electrónico en sí, con todas sus propiedades.
Usando el método EnumerateMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}
Usando el método EnumerateMapiMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var msg in folder.EnumerateMapiMessages())
{
// guardar mensaje en formato MSG
msg.Save($"{msg.Subject}.msg");
}
}
Otras propiedades útiles
Otras propiedades útiles de la clase OlmFolder son: HasMessages y MessageCount que devuelven la existencia de mensajes en la carpeta y su cantidad.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
if (folder.HasMessages)
{
Console.WriteLine($"Número de mensajes: {folder.MessageCount}");
}
}
Obtener o establecer la fecha de modificación de un mensaje
La fecha de modificación representa la fecha y hora en que se modificó por última vez el mensaje OLM. Puede usar la propiedad OlmMessageInfo.ModifiedDate para recuperar o actualizar el valor de la fecha de modificación de un mensaje OLM.
Aquí hay un ejemplo que demuestra el uso de la propiedad:
foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
DateTime modifiedDate = messageInfo.ModifiedDate;
}
Extracción de correos electrónicos
La clase OlmStorage tiene el método ExtractMapiMessage que permite extraer correos electrónicos. Este método recibe un objeto OlmMessageInfo.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
if (messageInfo.Date == DateTime.Today)
{
// Extrae los mensajes de hoy de la bandeja de entrada
var msg = olm.ExtractMapiMessage(messageInfo);
}
}
}
Extracción de todos los elementos de un correo electrónico utilizando la API de recorrido
Puede extraer todos los elementos de un archivo OLM de Outlook tanto como sea posible, sin lanzar excepciones, incluso si algunos datos del archivo original están corruptos. Para realizar esto, utilice el constructor OlmStorage(TraversalExceptionsCallback callback) y el método Load(string fileName) en lugar del método FromFile. El constructor permite definir un método de retorno de llamada.
using (var olm = new OlmStorage((exception, id) => { /* Código de manejo de excepciones. */ }))
El método de retorno de llamada hace que las excepciones de carga y recorrido estén disponibles.
El método Load devuelve ‘true’ si el archivo se ha cargado con éxito y es posible un recorrido posterior. Si un archivo está dañado y no es posible un recorrido, se devuelve ‘false’.
if (olm.Load(fileName))
El siguiente fragmento de código y los pasos muestran cómo usar esta API:
- Cree una nueva instancia de la clase OlmStorage, pasando un método de manejo de excepciones para manejar cualquier excepción que se encuentre durante el proceso.
- Cargue el archivo OLM llamando al método Load de la instancia de OlmStorage.
- Si el archivo OLM se carga con éxito, obtenga la jerarquía de carpetas llamando al método GetFolders en la instancia de OlmStorage. Esto devuelve una lista de objetos OlmFolder.
- Llame al método ExtractItems, pasando la instancia de OlmStorage y la lista de objetos OlmFolder.
- En el método ExtractItems, itere a través de cada carpeta en la lista de carpetas.
- Si la carpeta contiene mensajes (correos electrónicos), imprima el nombre de la carpeta en la consola usando Console.WriteLine(folder).
- Itere a través de los mensajes en la carpeta actual llamando al método EnumerateMessages en la instancia de OlmStorage, pasando la carpeta actual como argumento.
- Imprima el asunto de cada mensaje en la consola usando Console.WriteLine(msg.Subject).
- Si la carpeta tiene subcarpetas, llame recursivamente al método ExtractItems nuevamente, pasando la instancia de OlmStorage y las subcarpetas de la carpeta actual.
using (var olm = new OlmStorage((exception, id) => { /* Código de manejo de excepciones. */ }))
{
if (olm.Load(fileName))
{
var folderHierarchy = olm.GetFolders();
ExtractItems(olm, folderHierarchy);
}
}
private static void ExtractItems(OlmStorage olm, List<OlmFolder> folders)
{
foreach (var folder in folders)
{
if (folder.HasMessages)
{
Console.WriteLine(folder);
foreach (var msg in olm.EnumerateMessages(folder))
{
Console.WriteLine(msg.Subject);
}
}
if (folder.SubFolders.Count > 0)
{
ExtractItems(olm, folder.SubFolders);
}
}
}
Extraer mensajes de OLM por identificadores
El proceso de extracción de correos electrónicos se ha vuelto más fácil con la capacidad de extraer mensajes OLM seleccionados por identificadores. Es urgente para aplicaciones que almacenan identificadores en una base de datos. Extraer mensajes bajo demanda es la forma eficiente de evitar recorrer todo el almacenamiento cada vez para encontrar un mensaje específico para extraer. La propiedad EntryId de la clase OlmMessageInfo obtiene el identificador de entrada del mensaje. El método ExtractMapiMessage(string id) sobrecargado de la clase OlmStorage obtiene el mensaje de OLM. El siguiente fragmento de código demuestra el uso de estas características:
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
}
Obtener la ruta de la carpeta
También puede obtener la ruta de las carpetas en el archivo OML. Aspose.Email proporciona la propiedad OlmFolder.Path que devuelve la ruta de la carpeta. El siguiente fragmento de código demuestra el uso de la propiedad OlmFolder.Path para obtener las rutas de las carpetas en el archivo OML.
var storage = new OlmStorage("SampleOLM.olm");
PrintPath(storage, storage.FolderHierarchy);
public static void PrintPath(OlmStorage storage, List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
// imprimir la ruta de la carpeta actual
Console.WriteLine(folder.Path);
if (folder.SubFolders.Count > 0)
{
PrintPath(storage, folder.SubFolders);
}
}
}
Contar el número de elementos en la carpeta
También puede contar el número de elementos en la carpeta. Aspose.Email proporciona la propiedad OlmFolder.MessageCount que devuelve el número de elementos en la carpeta. El siguiente fragmento de código demuestra el uso de la propiedad OlmFolder.MessageCount para obtener el número de elementos en las carpetas del archivo OML.
var storage = new OlmStorage("SampleOLM.olm");
PrintMessageCount(storage.FolderHierarchy);
public static void PrintMessageCount(List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
Console.WriteLine("Número de mensajes [" + folder.Name + "]: " + folder.MessageCount);
}
}
Obtener el número total de elementos de OlmStorage
La clase OlmStorage también tiene el método GetTotalItemsCount() que devuelve el número total de elementos de mensaje contenidos en el almacenamiento OLM.
using (var olm = new OlmStorage("storage.olm"))
{
var count = olm.GetTotalItemsCount();
}
Extraer mensajes de OLM por identificadores
A veces es necesario extraer mensajes seleccionados por identificadores. Por ejemplo, su aplicación almacena identificadores en una base de datos y extrae un mensaje bajo demanda. Esta es la forma eficiente de evitar recorrer todo el almacenamiento cada vez para encontrar un mensaje específico a extraer. Esta característica está disponible para los almacenes OLM.
El siguiente código muestra cómo extraer mensajes de OLM por identificadores.
El código realiza los siguientes pasos:
- Inicia un bucle foreach para iterar a través de una lista de objetos OlmMessageInfo . El bucle utiliza el método EnumerateMessages del objeto olmFolder para recuperar una lista de todos los mensajes en la carpeta actual que se está iterando.
- El bucle extrae el objeto MapiMessage correspondiente del almacenamiento llamando al método ExtractMapiMessage(string id) de la clase OlmStorage, pasando el EntryId del mensaje actual como parámetro.
El objeto MapiMessage recuperado se puede utilizar para acceder y manipular el contenido del mensaje. El bucle continúa hasta que se han procesado todos los mensajes en la carpeta.
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
}
Recuperación de colores de categorías de Outlook
Para trabajar con colores de categorías o categorías de elementos de Outlook almacenados en archivos OLM, Aspose.Email ofrece las siguientes soluciones:
- La clase OlmItemCategory - representa categorías de elementos de Outlook que están disponibles por su nombre y colores asociados, representados en formato hexadecimal.
- El método GetCategories() de la clase OlmStorage - recupera la lista de categorías.
El siguiente ejemplo de código demuestra cómo obtener todas las categorías utilizadas del almacenamiento OML:
using (var olm = OlmStorage.FromFile("storage.olm"))
{
var categories = olm.GetCategories();
foreach (var category in categories)
{
Console.WriteLine($"Nombre de la categoría: {category.Name}");
//El color se representa como un valor hexadecimal: #rrggbb
Console.WriteLine($"Color de la categoría: {category.Color}");
}
}
El siguiente ejemplo de código muestra cómo obtener el color de categoría de un mensaje:
foreach (var msg in olm.EnumerateMessages(folder))
{
if (msg.Categories != null)
{
foreach (var msgCategory in msg.Categories)
{
Console.WriteLine($"Nombre de la categoría: {msgCategory}");
var categoryColor = cat.First(c => c.Name.Equals(msgCategory, StringComparison.OrdinalIgnoreCase)).Color;
Console.WriteLine($"Color de la categoría: {categoryColor}");
}
}
}