Programación con Thunderbird
Leyendo archivos MBOX
Mozilla Thunderbird es un cliente de correo de código abierto y multiplataforma, desarrollado por la Mozilla Foundation. Almacena correos en su propia estructura de archivos, gestionando índices de mensajes y subcarpetas mediante formatos de archivo propietarios. Aspose.Email puede trabajar con las estructuras de almacenamiento de correo de Thunderbird. El MboxrdStorageReader la clase permite a los desarrolladores leer mensajes del archivo de almacenamiento de correo de Mozilla Thunderbird. Este artículo muestra cómo leer los mensajes del almacenamiento de correo de Thunderbird:
- Abra el archivo de almacenamiento de Thunderbird en FileStream.
- Cree una instancia de la MboxrdStorageReader clase y pase el flujo anterior al constructor.
- Llame a ReadNextMessage() para obtener el primer mensaje.
- Use el mismo ReadNextMessage() en un bucle while para leer todos los mensajes.
- Cerrar todos los flujos.
El siguiente fragmento de código le muestra cómo leer todos los mensajes de un almacenamiento de correo de Thunderbird.
// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();
// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read);
// Create an instance of the MboxrdStorageReader class and pass the stream
var reader = new MboxrdStorageReader(stream, false);
// Start reading messages
var message = reader.ReadNextMessage();
// Read all messages in a loop
while (message != null)
{
// Manipulate message - show contents
Console.WriteLine("Subject: " + message.Subject);
// Save this message in EML or MSG format
message.Save(message.Subject + ".eml", SaveOptions.DefaultEml);
message.Save(message.Subject + ".msg", SaveOptions.DefaultMsgUnicode);
// Get the next message
message = reader.ReadNextMessage();
}
// Close the streams
reader.Dispose();
stream.Close();
Obtención de propiedades del mensaje
MboxMessageInfo la clase contiene las siguientes propiedades para obtener información sobre un mensaje:
- DateTime Date - Obtiene la fecha del mensaje
- MailAddress From - Obtiene la dirección del remitente
- string Subject - Obtiene el asunto del mensaje
- MailAddressCollection Para - Obtiene la colección de direcciones que contiene los destinatarios del mensaje
- MailAddressCollection CC - Obtiene la colección de direcciones que contiene los destinatarios CC
- MailAddressCollection Bcc - Obtiene la colección de direcciones que contiene los destinatarios BCC del mensaje
MboxStorageReader reader = MboxStorageReader.CreateReader(fileName, new MboxLoadOptions());
foreach (var mboxMessageInfo in reader.EnumerateMessageInfo())
{
Console.Writeline($"Subject: {mboxMessageInfo.Subject}");
Console.Writeline($"Date: {mboxMessageInfo.Date}");
Console.Writeline($"From: {mboxMessageInfo.From}");
Console.Writeline($"To: {mboxMessageInfo.To}");
Console.Writeline($"CC: {mboxMessageInfo.CC}");
Console.Writeline($"Bcc: {mboxMessageInfo.Bcc}");
}
Extraer mensajes de MBOX por identificadores
El MboxStorageReader la clase incluye el EnumerateMessageInfo() método, que le permite iterar a través de cada mensaje en un archivo MBOX. Al usar este método, es posible extraer mensajes individuales sin necesidad de recorrer todo el almacenamiento repetidamente. Esto mejora el rendimiento y reduce el tiempo de procesamiento.
El MboxMessageInfo class proporciona el EntryId propiedad, que brinda acceso a identificadores únicos para cada mensaje en el archivo MBOX. Este identificador puede almacenarse en una base de datos o usarse como referencia para encontrar y extraer rápidamente mensajes específicos cuando sea necesario.
El ExtractMessage(string id) método en el MboxStorageReader la clase permite a los desarrolladores extraer mensajes basándose en su EntryId único. Con el ExtractMessage(string id) método, puede aprovechar el EntryId almacenado para recuperar el mensaje correspondiente y realizar operaciones adicionales con él.
El siguiente ejemplo de código demuestra cómo extraer mensajes de un archivo MBOX usando identificadores:
MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());
foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}
Configurando las opciones de carga al leer mensajes desde MBOX
Las siguientes características le permitirán especificar varias opciones relacionadas con la carga y el procesamiento de mensajes:
-
Propiedad MailStorageConverter.MboxMessageOptions - Obtiene o establece las opciones de carga de correo electrónico al analizar un almacenamiento Mbox.
-
Método MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) - El parámetro EmlLoadOptions especifica opciones al leer un mensaje del almacenamiento Mbox.
var reader = new MboxrdStorageReader(fileName, new MboxLoadOptions());
// Read messages preserving tnef attachments.
var eml = reader.ReadNextMessage(new EmlLoadOptions {PreserveTnefAttachments = true});
MailStorageConverter.MboxMessageOptions(new EmlLoadOptions {PreserveTnefAttachments = true});
// Convert messages from mbox to pst preserving tnef attachments.
var pst = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");
Configuración de la Codificación de Texto Preferida al Cargar Archivos Mbox para Lectura
La opción de codificación está disponible para la clase MboxrdStorageReader. Esto proporciona opciones adicionales para cargar el archivo mbox y garantiza que los mensajes con contenido codificado se lean y procesen correctamente. El siguiente fragmento de código muestra cómo puede establecer la codificación de texto que satisfaga sus necesidades:
var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();
Obtener el número total de mensajes del archivo MBOX
El MboxrdStorageReader Clase que proporciona la capacidad de leer el número de elementos disponibles en un archivo MBox. Esto puede usarse para desarrollar aplicaciones que muestren el progreso de la actividad mientras se procesa dicho archivo.
// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();
using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
Console.WriteLine("Total number of messages in Mbox file: " + reader.GetTotalItemsCount());
}
Obtener el tamaño del mensaje actual
using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
MailMessage msg;
while ((msg = reader.ReadNextMessage()) != null)
{
long currentDataSize = reader.CurrentDataSize;
msg.Dispose();
}
}
Convirtiendo MBOX a PST Conservando o Eliminando una Firma
Para eliminar la firma de un archivo durante el proceso de conversión, establezca el MboxToPstConversionOptions.RemoveSignature propiedad a true.
El siguiente fragmento de código muestra cómo utilizar esta propiedad:
var pstDataStream = new MemoryStream();
var personalStorage = PersonalStorage.Create(pstDataStream, FileFormatVersion.Unicode);
MailStorageConverter.MboxToPst(new MboxrdStorageReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), new MboxLoadOptions()),
personalStorage,
"Inbox",
new MboxToPstConversionOptions() { RemoveSignature = true });
Escribiendo archivos MBOX
El MboxrdStorageWriter la clase brinda la capacidad de escribir nuevos mensajes en el archivo de almacenamiento de correo de Thunderbird. Para escribir mensajes:
- Abra el archivo de almacenamiento de Thunderbird en FileStream.
- Cree una instancia de la MboxrdStorageWriter clase y pase el flujo anterior al constructor.
- Prepare un nuevo mensaje usando el MailMessage clase.
- Llame al WriteMessage() método y pase lo anterior MailMessage instancia para agregar el mensaje al almacenamiento de Thunderbird.
- Cerrar todos los flujos.
El siguiente fragmento de código muestra cómo escribir mensajes en el almacenamiento de correo de Thunderbird.
// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Write);
// Initialize MboxStorageWriter and pass the above stream to it
var writer = new MboxrdStorageWriter(stream, false);
// Prepare a new message using the MailMessage class
var message = new MailMessage("from@domain.com", "to@domain.com", Guid.NewGuid().ToString(), "added from Aspose.Email");
message.IsDraft = false;
// Add this message to storage
writer.WriteMessage(message);
// Close all related streams
writer.Dispose();
stream.Close();
Dividir almacenamiento MBOX/Cancelar operación de división
Aspose.Email ofrece métodos para dividir el almacenamiento Mbox en partes más pequeñas, facilitando el manejo de archivos de correo electrónico grandes. Según la versión de .NET que esté utilizando, los métodos disponibles y sus parámetros pueden variar. A continuación se muestran los métodos de la MboxStorageReader clase utilizada tanto para .NET Framework 4.5 como para versiones de .NET Core, así como para versiones inferiores a 4.5.
Miembros para .NET Framework 4.5 y versiones de .NET Core:
-
SplitInto(long chunkSize, string outputPath, CancellationToken token) - Divide el almacenamiento Mbox en partes más pequeñas según el tamaño de fragmento especificado.
-
Parámetros:
- chunkSize: El tamaño aproximado de cada fragmento en bytes.
- outputPath: La ruta de carpeta donde se crearán los fragmentos.
- token: Un CancellationToken que permite la posible cancelación de la operación.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - Divide el almacenamiento Mbox en partes más pequeñas con un prefijo de nombre de archivo especificado para cada parte.
-
Parámetros:
- chunkSize: El tamaño aproximado de cada fragmento en bytes.
- outputPath: La ruta de carpeta donde se crearán los fragmentos.
- partFileNamePrefix: El prefijo que se añadirá al nombre de archivo de cada parte.
- token: Un CancellationToken que permite la posible cancelación de la operación.
Miembros para versiones del .NET Framework inferiores a 4.5:
-
SplitInto(long chunkSize, string outputPath) - Divide el almacenamiento Mbox en partes más pequeñas según el tamaño de fragmento especificado.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - Divide el almacenamiento Mbox en partes más pequeñas con un prefijo de nombre de archivo especificado para cada parte.
-
Cancel() - Interrumpe una operación de división en curso.
Los siguientes ejemplos de código demuestran cómo dividir un archivo MBOX en partes limitando el proceso a un máximo de cinco partes, utilizando un mecanismo de cancelación:
.NET Framework 4.5 y .NET Core:
int partCount = 0;
var tokenSource = new CancellationTokenSource();
var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });
// Subscribe to events
mbox.MboxFileCreated += (sender, e) =>
{
partCount++;
if (partCount >= 5)
tokenSource.Cancel();
};
System.Threading.Tasks.Task task = mbox.SplitInto(10000000, outputPath, tokenSource.Token);
task.Wait();
.NET Framework inferior a 4.5:
int partCount = 0;
var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });
mbox.SplitInto(10000000, outputPath);
mbox.MboxFileCreated += (sender, e) =>
{
partCount++;
if (partCount >= 5)
mbox.Cancel();
};