Trabalhando com arquivos PST grandes

Processar arquivos grandes de Personal Storage Table (PST) pode reduzir o desempenho e aumentar o uso de memória. O Aspose.Email for Java oferece várias técnicas e APIs que permitem aos desenvolvedores acessar, processar e gerenciar dados de caixas de correio de forma eficiente, sem sobrecarregar os recursos do sistema.

Use Métodos Iteráveis para Percorrer Pastas e Mensagens

Ao iterar por pastas e mensagens, prefira métodos que retornam Iterable. Isso reduz o uso de memória e melhora o desempenho.

try (PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
    for (FolderInfo folder : pst.getRootFolder().enumerateFolders()) {
        for (MessageInfo messageInfo : folder.enumerateMessages()) {
            // Process message
        }
    }
}

Use MessageInfo para Propriedades Básicas da Mensagem

Se precisar apenas de detalhes básicos da mensagem, use MessageInfo em vez de carregar a mensagem completa. Isso é mais rápido e consome menos memória.

for (MessageInfo messageInfo : folder.enumerateMessages()) {
    System.out.println("Subject: " + messageInfo.getSubject());
    System.out.println("To: " + messageInfo.getDisplayTo());
    System.out.println("Importance: " + messageInfo.getImportance());
    System.out.println("Message Class: " + messageInfo.getMessageClass());
}

Evite Extrair Mensagens Inteiras a Menos que Seja Necessário

Não use ExtractMessage ou EnumerateMapiMessages métodos para todas as mensagens, a menos que precise de todas as propriedades.

Em vez disso, considere:

a) Recuperar IDs de Mensagens

Usar enumerateMessagesEntryId para obter todos os IDs de mensagens em uma pasta. Você pode então extrair seletivamente propriedades, mensagens ou anexos.

for (String id : folder.enumerateMessagesEntryId()) {
    // Retrieve a property using ID (extractProperty),
    // Extract a MapiMessage (extractMessage),
    // Extract message attachments (extractAttachments),
    // Save message to a stream (saveMessageToStream).
}

b) Extrair uma Única Propriedade

Usar ExtractProperty se precisar apenas de uma propriedade específica ausente em MessageInfo.

for (String msgId : folder.enumerateMessagesEntryId()) {
    String transportMessageHeaders =
        pst.extractProperty(
            org.apache.commons.codec.binary.Base64.decodeBase64(msgId),
            KnownPropertyList.TRANSPORT_MESSAGE_HEADERS.getTag()
        ).getString();
}

c) Extrair Apenas Anexos

Se apenas anexos forem necessários, use ExtractAttachments.

for (String msgId : folder.enumerateMessagesEntryId()) {
    MapiAttachmentCollection attachments = pst.extractAttachments(msgId);
}

Use Critérios de Pesquisa para Filtrar Mensagens

Filtrando mensagens usando critérios de pesquisa reduz o número de mensagens carregadas e melhora o desempenho.

try (PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {

    PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
    // Unread messages
    builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);

    for (FolderInfo folder : pst.getRootFolder().enumerateFolders()) {
        MessageInfoCollection unread = folder.getContents(builder.getQuery());
    }
}

Salvar Mensagens em Stream

Em vez de extrair e salvar mensagens uma a uma, use SaveMessageToStream para melhor desempenho.

for (String id : folder.enumerateMessagesEntryId()) {
    try (OutputStream fos  = new FileOutputStream("message.msg")) {
        pst.saveMessageToStream(id, fos);
    }
}

Use Métodos em Lote Sempre que Possível

Sempre que precisar adicionar ou delete vários itens, prefira métodos em lote em vez de operações individuais. Isso reduz a sobrecarga e melhora o desempenho.