Programação com Thunderbird
Lendo Arquivos MBOX
Mozilla Thunderbird é um cliente de email de código aberto e multiplataforma, desenvolvido pela Mozilla Foundation. Ele armazena emails em sua própria estrutura de arquivos, gerenciando índices de mensagens e subpastas através de formatos de arquivo proprietários. Aspose.Email pode trabalhar com as estruturas de armazenamento de email do Thunderbird. O MboxrdStorageReader classe permite que desenvolvedores leiam mensagens de um arquivo de armazenamento de e‑mail do Mozilla Thunderbird. Este artigo mostra como ler as mensagens do armazenamento de e‑mail do Thunderbird:
- Abra o arquivo de armazenamento do Thunderbird em FileStream.
- Crie uma instância do MboxrdStorageReader classe e passe o stream acima ao construtor.
- Chame ReadNextMessage() para obter a primeira mensagem.
- Use o mesmo ReadNextMessage() em um loop while para ler todas as mensagens.
- Feche todos os streams.
O trecho de código a seguir mostra como ler todas as mensagens de um armazenamento de email do 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();
Recuperando Propriedades da Mensagem
MboxMessageInfo classe contém as seguintes propriedades para recuperar informações sobre uma mensagem:
- DateTime Date - Obtém a data da mensagem
- MailAddress From - Obtém o endereço do remetente
- string Subject - Obtém o assunto da mensagem
- MailAddressCollection Para - Obtém a coleção de endereços que contém os destinatários da mensagem
- MailAddressCollection CC - Obtém a coleção de endereços que contém os destinatários CC
- MailAddressCollection Bcc - Obtém a coleção de endereços que contém os destinatários CCO da mensagem
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}");
}
Extrair Mensagens de MBOX por Identificadores
O MboxStorageReader classe inclui o EnumerateMessageInfo() método, que permite iterar por cada mensagem em um arquivo MBOX. Ao usar este método, torna-se possível extrair mensagens individuais sem precisar percorrer todo o armazenamento repetidamente. Isso melhora o desempenho e reduz o tempo de processamento.
O MboxMessageInfo classe fornece o EntryId propriedade, que fornece acesso a identificadores únicos para cada mensagem no arquivo MBOX. Esse identificador pode ser armazenado em um banco de dados ou usado como referência para encontrar e extrair rapidamente mensagens específicas quando necessário.
O ExtractMessage(string id) método na MboxStorageReader classe permite que desenvolvedores extraiam mensagens com base em seu EntryId único. Com o ExtractMessage(string id) método, você pode usar o EntryId armazenado para recuperar a mensagem correspondente e realizar operações adicionais com ela.
O exemplo de código a seguir demonstra como extrair mensagens de um arquivo 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 as Opções de Carregamento ao Ler Mensagens de MBOX
Os recursos a seguir permitirão especificar várias opções relacionadas ao carregamento e processamento de mensagens:
-
Propriedade MailStorageConverter.MboxMessageOptions - Obtém ou define opções de carregamento de e‑mail ao analisar um armazenamento Mbox.
-
Método MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) - O parâmetro EmlLoadOptions especifica opções ao ler a mensagem do armazenamento 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");
Definindo a Codificação de Texto Preferida ao Carregar Arquivos Mbox para Leitura
A opção de codificação está disponível para a classe MboxrdStorageReader. Isso fornece opções adicionais para carregar o arquivo mbox e garante que mensagens com conteúdo codificado sejam lidas e processadas corretamente. O trecho de código a seguir mostra como você pode definir a codificação de texto que atenda às suas necessidades:
var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();
Obtendo o Número Total de Mensagens do Arquivo MBOX
O MboxrdStorageReader classe fornece a capacidade de ler o número de itens disponíveis em um arquivo MBox. Isso pode ser usado para desenvolver aplicativos que exibam o progresso da atividade ao processar tal arquivo.
// 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());
}
Obter Tamanho da Mensagem Atual
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();
}
}
Convertendo MBOX para PST Preservando ou Removendo uma Assinatura
Para remover a assinatura de um arquivo durante o processo de conversão, defina o MboxToPstConversionOptions.RemoveSignature propriedade para true.
O exemplo de código a seguir mostra como utilizar esta propriedade:
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 });
Escrevendo Arquivos MBOX
O MboxrdStorageWriter classe fornece a capacidade de escrever novas mensagens no arquivo de armazenamento de e‑mail do Thunderbird. Para escrever mensagens:
- Abra o arquivo de armazenamento do Thunderbird em FileStream.
- Crie uma instância do MboxrdStorageWriter classe e passe o stream acima ao construtor.
- Prepare uma nova mensagem usando o MailMessage classe.
- Chame o WriteMessage() método e passe o acima MailMessage instância para adicionar a mensagem ao armazenamento do Thunderbird.
- Feche todos os streams.
O trecho de código a seguir mostra como escrever mensagens no armazenamento de e‑mail do 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 Armazenamento MBOX/Cancelar Operação de Divisão
Aspose.Email fornece métodos para dividir o armazenamento Mbox em partes menores, facilitando o manuseio de grandes arquivos de e‑mail. Dependendo da versão .NET que você está usando, os métodos disponíveis e seus parâmetros podem variar. Abaixo estão os métodos de MboxStorageReader classe usada tanto para .NET Framework 4.5 quanto para versões do .NET Core, bem como para versões abaixo de 4.5.
Membros para .NET Framework 4.5 e versões do .NET Core:
-
SplitInto(long chunkSize, string outputPath, CancellationToken token) - Divide o armazenamento Mbox em partes menores com base no tamanho de bloco especificado.
-
Parâmetros:
- chunkSize: O tamanho aproximado de cada bloco em bytes.
- outputPath: O caminho da pasta onde os blocos serão criados.
- token: Um CancellationToken que permite o possível cancelamento da operação.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - Divide o armazenamento Mbox em partes menores com um prefixo de nome de arquivo especificado para cada parte.
-
Parâmetros:
- chunkSize: O tamanho aproximado de cada bloco em bytes.
- outputPath: O caminho da pasta onde os blocos serão criados.
- partFileNamePrefix: O prefixo a ser adicionado ao nome de arquivo de cada parte.
- token: Um CancellationToken que permite o possível cancelamento da operação.
Membros para versões do .NET Framework abaixo de 4.5:
-
SplitInto(long chunkSize, string outputPath) - Divide o armazenamento Mbox em partes menores com base no tamanho de bloco especificado.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - Divide o armazenamento Mbox em partes menores com um prefixo de nome de arquivo especificado para cada parte.
-
Cancel() - Interrompe uma operação de divisão em andamento.
Os exemplos de código a seguir demonstram como dividir um arquivo MBOX em partes, limitando o processo a no máximo cinco partes, utilizando um mecanismo de cancelamento:
.NET Framework 4.5 e .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();
};