Trabajando con archivos PST grandes

Procesar archivos grandes de Personal Storage Table (PST) puede reducir el rendimiento e incrementar el uso de memoria. Aspose.Email para Java ofrece varias técnicas y API que permiten a los desarrolladores acceder, procesar y gestionar los datos del buzón de forma eficiente sin sobrecargar los recursos del sistema.

Utiliza Métodos Iterables para Recorrer Carpetas y Mensajes

Al iterar a través de carpetas y mensajes, prefiere métodos que devuelvan Iterable. Esto reduce la sobrecarga de memoria y mejora el rendimiento.

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

Utiliza MessageInfo para Propiedades Básicas del Mensaje

Si solo necesitas los detalles básicos del mensaje, usa MessageInfo en lugar de cargar el mensaje completo. Esto es más rápido y consume menos memoria.

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 extraer mensajes completos a menos que sea necesario

No use ExtractMessage o EnumerateMapiMessages métodos para todos los mensajes a menos que necesite todas las propiedades.

En su lugar, considere:

a) Recuperar IDs de mensajes

Usar enumerateMessagesEntryId para obtener todos los IDs de mensajes en una carpeta. Luego puede extraer selectivamente propiedades, mensajes o adjuntos.

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) Extraer una única propiedad

Usar ExtractProperty si solo necesita una propiedad específica que falta en 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) Extraer solo adjuntos

Si solo se necesitan los archivos adjuntos, use ExtractAttachments.

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

Utilice criterios de búsqueda para filtrar mensajes

Filtrar mensajes usando criterios de búsqueda reduce la cantidad de mensajes cargados y mejora el rendimiento.

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());
    }
}

Guardar mensajes en stream

En lugar de extraer y guardar los mensajes uno por uno, use SaveMessageToStream para un mejor rendimiento.

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

Utilice métodos masivos cuando sea posible

Cada vez que necesite agregar o eliminar múltiples elementos, prefiera métodos masivos sobre operaciones individuales. Esto reduce la sobrecarga y mejora el rendimiento.