Programação com Thunderbird

Ler Mensagens de 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 do arquivo de armazenamento de email do Mozilla Thunderbird. Este artigo mostra como ler as mensagens do armazenamento de email do Thunderbird:

  1. Abra o arquivo de armazenamento do Thunderbird em FileStream.
  2. Crie uma instância do MboxrdStorageReader classe e passe o stream acima ao construtor.
  3. Chame ReadNextMessage() para obter a primeira mensagem.
  4. Use o mesmo ReadNextMessage() em um loop while para ler todas as mensagens.
  5. Feche todos os streams.

O trecho de código a seguir mostra como ler todas as mensagens de um armazenamento de email do Thunderbird.

//Getting Marker information while reading messages from Mbox storage file
try (FileInputStream stream = new FileInputStream(dataDir + "Outlook.pst")) {
    MboxLoadOptions lo = new MboxLoadOptions();
    lo.setLeaveOpen(false);
    try (MboxrdStorageReader reader = new MboxrdStorageReader(stream, lo)) {
        MailMessage msg;
        String[] fromMarker = {null};
        while ((msg = reader.readNextMessage(/* out */fromMarker)) != null) {
            System.out.println(fromMarker[0]);
        }
    }
}

Configurar Opções de Carregamento ao Ler Mensagens de MBOX

A API Aspose.Email permite as seguintes manipulações com mensagens ao lê-las de um arquivo MBOX:

Converter Mensagens de MBOX para PST Preservando Anexos TNEF

EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
MailStorageConverter.setMboxMessageOptions(emlLoadOptions);
// Convert messages from mbox to pst preserving tnef attachments.
PersonalStorage storage = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");

MailStorageConverter.MboxMessageOptions() propriedade - Obtém ou define opções de carregamento de email ao analisar um armazenamento Mbox.

Ler Mensagens Preservando Anexos TNEF

MboxrdStorageReader reader = new MboxrdStorageReader("Input.mbox", new MboxLoadOptions());
// Read messages preserving tnef attachments.
EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
MailMessage eml = reader.readNextMessage(emlLoadOptions);

MboxrdStorageReader.readNextMessage(EmlLoadOptions options) método - O parâmetro EmlLoadOptions especifica opções ao ler uma mensagem do armazenamento Mbox.

Enumerar Mensagens Preservando Anexos TNEF

EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
// Enumerate messages preserving tnef attachments.
for (MailMessage message : reader.enumerateMessages(emlLoadOptions)) {
    // do something
}

MboxrdStorageReader.enumerateMessages(EmlLoadOptions options) método - Especifica EmlLoadOptions ao ler uma mensagem do armazenamento Mbox.

Extrair Mensagens de MBOX por Identificadores

Às vezes é necessário extrair mensagens selecionadas por identificadores. Por exemplo, sua aplicação armazena identificadores em um banco de dados e extrai uma mensagem sob demanda. Essa é a forma eficiente de evitar percorrer todo o armazenamento a cada vez para encontrar uma mensagem específica a ser extraída. Para implementar esse recurso para arquivos MBOX, a Aspose.Email fornece os seguintes métodos e classes:

O exemplo de código abaixo demonstra como extrair mensagens de um MBOX por identificadores:

MboxStorageReader reader = MboxStorageReader.createReader("my.mbox", new MboxLoadOptions());

for (MboxMessageInfo msgInfo : reader.enumerateMessageInfo()) {
    MailMessage eml = reader.extractMessage(msgInfo.getEntryId(), new EmlLoadOptions());
}

Nota: O ID da mensagem é único dentro do arquivo de armazenamento. Os IDs são criados pela Aspose.Email e não podem ser usados em outras bibliotecas ou aplicativos de processamento MBOX de terceiros.

Filtrar e Pesquisar Emails em Arquivos MBOX

Aspose.Email for Java fornece a capacidade de filtrar ou pesquisar mensagens dentro de arquivos MBOX usando uma consulta. Isso permite recuperar somente as mensagens que correspondem a critérios específicos. Dessa forma, você pode melhorar o desempenho e a usabilidade de um aplicativo ao trabalhar com arquivos MBOX grandes.

O exemplo de código abaixo demonstra como implementar esse recurso realizando os seguintes métodos:

  • enumerateMessages(MailQuery query) - retorna uma coleção enumerável de instâncias MailMessage que correspondem à consulta especificada.

  • enumerateMessageInfo(MailQuery query) - retorna uma coleção enumerável de instâncias MboxMessageInfo que correspondem à consulta especificada.

MboxStorageReader reader = MboxStorageReader.createReader("input.mbox", new MboxLoadOptions());
MailQueryBuilder mqb = new MailQueryBuilder();
mqb.getSubject().contains("Project Update");
mqb.getSentDate().before(new Date());

for (MailMessage message : reader.enumerateMessages(mqb.getQuery())) {
    System.out.println("Subject: " + message.getSubject());
}

Recuperação Paginada de Mensagens de Arquivos MBOX

Aspose.Email for Java suporta a recuperação paginada de mensagens de arquivos MBOX. Esse recurso permite o processamento eficiente de arquivos MBOX grandes ao recuperar mensagens em lotes menores, reduzindo o consumo de memória e melhorando o desempenho.

O exemplo de código abaixo demonstra como implementar esse recurso realizando os seguintes métodos:

  • enumerateMessages(int startIndex, int count) - recupera um número especificado de instâncias MailMessage a partir de um índice fornecido.

  • enumerateMessageInfo(int startIndex, int count) - recupera um número especificado de instâncias MboxMessageInfo a partir de um índice fornecido.

MboxStorageReader reader = MboxStorageReader.createReader("input.mbox", new MboxLoadOptions());
int startIndex = 0;
int count = 10; // Retrieve messages in batches of 10

for (MailMessage message : reader.enumerateMessages(startIndex, count)) {
    System.out.println("Subject: " + message.getSubject());
}

Escrevendo Mensagens

O MboxrdStorageWriter classe fornece a funcionalidade de escrever novas mensagens no arquivo de armazenamento de email do Thunderbird. Para escrever mensagens:

  1. Abra o arquivo de armazenamento do Thunderbird em FileStream.
  2. Crie uma instância do MboxrdStorageWriter classe e passe o stream acima ao construtor.
  3. Prepare uma nova mensagem usando o MailMessage classe.
  4. Chame o WriteMessage() método e passe o acima MailMessage instância para adicionar a mensagem ao armazenamento do Thunderbird.
  5. Feche todos os streams.

O trecho de código a seguir mostra como escrever mensagens no armazenamento de email do Thunderbird.

//Getting marker information while writing messages to Mbox storage file
try (FileOutputStream writeStream = new FileOutputStream(dataDir + "inbox")) {
    try (MboxrdStorageWriter writer = new MboxrdStorageWriter(writeStream, false)) {
        MailMessage msg = MailMessage.load(dataDir + "Message.msg");
        String[] fromMarker = {null};
        writer.writeMessage(msg, fromMarker);
        System.out.println(fromMarker[0]);
    }
}

Obter Número Total de Mensagens de um 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.

MboxLoadOptions lo = new MboxLoadOptions();
try (MboxrdStorageReader reader = new MboxrdStorageReader("inbox.dat", lo)) {
    System.out.println("Total number of messages in Mbox file: " + reader.getTotalItemsCount());
}

Obter Tamanho da Mensagem Atual

FileInputStream stream = new FileInputStream(dataDir + "ExampleMbox.mbox");
MboxLoadOptions lo = new MboxLoadOptions();
try (MboxrdStorageReader reader = new MboxrdStorageReader(stream, lo)) {
    MailMessage msg = null;
    while ((msg = reader.readNextMessage()) != null) {
        //returns the number of bytes read
        long currentDataSize = reader.getCurrentDataSize();
        System.out.println("Bytes read: " + currentDataSize);
    }
}

Definir Codificação de Texto Preferida ao Carregar Arquivos Mbox

O setPreferredTextEncoding(Charset value) método do MboxLoadOptions classe obtém ou define a codificação preferida para mensagens. Crie um leitor para o arquivo Mbox com as opções de carregamento especificadas e suas mensagens com o conteúdo codificado serão lidas e processadas corretamente. O exemplo de código a seguir mostra como implementar esse recurso em um projeto:

MboxLoadOptions lo = new MboxLoadOptions();
lo.setPreferredTextEncoding(Charset.forName("utf-8"));
MboxrdStorageReader reader = new MboxrdStorageReader("sample.mbox", lo);
MailMessage message = reader.readNextMessage();

Dividir o Armazenamento Mbox em Partes Menores

Aspose.Email fornece os seguintes componentes projetados para oferecer maior controle sobre o processamento de armazenamento Mbox, permitindo dividir arquivos grandes em partes gerenciáveis e implementar ações personalizadas durante o processo:

MboxStorageReader.SplitInto(long chunkSize, String outputPath, String partFileNamePrefix) Uma variação do método anterior, este também permite especificar um prefixo personalizado para os nomes dos arquivos Mbox divididos.

MboxStorageReader.setEmlCopyingEventHandler Evento Este evento ocorre antes de um email ser copiado para um novo arquivo Mbox. Você pode personalizar ações antes que os emails sejam processados.

MboxStorageReader.setEmlCopiedEventHandler Evento Este evento ocorre após um email ser copiado para um novo arquivo Mbox. Você pode executar ações de pós‑processamento nos emails.

MboxStorageReader.setMboxFileCreatedEventHandler Evento Este evento ocorre quando um novo arquivo Mbox é criado. Você pode tratar este evento para reagir à criação do arquivo.

MboxStorageReader.setMboxFileFilledEventHandler Evento Este evento ocorre quando um novo arquivo Mbox é preenchido com emails. Você pode responder ao arquivo sendo populado com emails.

NewStorageEventHandler(Object sender, NewStorageEventArgs e) Representa um delegate para manipular eventos que ocorrem após a criação ou o processamento de um novo arquivo de armazenamento.

MimeItemCopyEventHandler(Object sender, MimeItemCopyEventArgs e) Representa um delegate para manipular eventos relacionados à cópia de itens Mime, tipicamente usado em cenários onde um objeto MailMessage é copiado de um armazenamento para outro.

NewStorageEventArgs Representa os argumentos usados em eventos que são disparados após a criação de um novo arquivo de armazenamento ou após seu processamento.

MimeItemCopyEventArgs Representa os argumentos de evento relacionados à cópia de um objeto MailMessage de um armazenamento para outro, seja antes do início da cópia ou após sua conclusão.

O exemplo de código abaixo demonstra como interagir com arquivos Mbox, lidar com eventos relacionados a esses arquivos e executar operações como dividir o armazenamento Mbox em partes menores, mantendo o controle da contagem de mensagens e da contagem de partes:

messageCount = 0;
partCount = 0;

// Create an instance of MboxrdStorageReader
MboxLoadOptions lo = new MboxLoadOptions();
lo.setLeaveOpen(false);
MboxrdStorageReader mbox = new MboxrdStorageReader("my.mbox", lo);

// Subscribe to events
mbox.setMboxFileCreatedEventHandler(new NewStorageEventHandler() {
    public void invoke(Object sender, NewStorageEventArgs e) {
        System.out.println("New Mbox file created: " + e.getFileName());
        partCount++;
    }
});

mbox.setMboxFileFilledEventHandler(new NewStorageEventHandler() {
    public void invoke(Object sender, NewStorageEventArgs e) {
        System.out.println("Mbox file filled with messages: " + e.getFileName());
    }
});

mbox.setEmlCopiedEventHandler(new MimeItemCopyEventHandler() {
    public void invoke(Object sender, MimeItemCopyEventArgs e) {
        System.out.println("Message added to new Mbox file. Subject: " + e.getItem().getSubject());
        messageCount++;
    }
});

// Split the Mbox storage into smaller parts
mbox.splitInto(10000000, testOutPath, "Prefix");

// Output the final messageCount and partCount
System.out.println("Total messages added: " + messageCount);
System.out.println("Total parts created: " + partCount);