Travailler avec de gros fichiers PST

Le traitement de gros fichiers Personal Storage Table (PST) peut réduire les performances et augmenter l’utilisation de la mémoire. Aspose.Email for Java fournit plusieurs techniques et API qui permettent aux développeurs d’accéder, de traiter et de gérer les données de boîte aux lettres efficacement sans surcharger les ressources du système.

Utilisez les méthodes itérables pour parcourir les dossiers et les messages

Lorsque vous parcourez les dossiers et les messages, privilégiez les méthodes qui renvoient Iterable. Cela réduit la surcharge mémoire et améliore les performances.

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

Utilisez MessageInfo pour les propriétés de base du message

Si vous avez besoin uniquement des détails de base du message, utilisez MessageInfo au lieu de charger le message complet. C’est plus rapide et consomme moins de mémoire.

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

Évitez d’extraire des messages complets sauf si nécessaire

N’utilisez pas ExtractMessage ou EnumerateMapiMessages méthodes pour tous les messages sauf si vous avez besoin de toutes les propriétés.

Sinon, envisagez :

a) Récupération des IDs de messages

Utiliser enumerateMessagesEntryId pour obtenir tous les IDs de messages dans un dossier. Vous pouvez ensuite extraire sélectivement les propriétés, les messages ou les pièces jointes.

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) Extraction d’une seule propriété

Utiliser ExtractProperty si vous avez besoin uniquement d’une propriété spécifique manquante dans 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) Extraction des pièces jointes uniquement

Si seules les pièces jointes sont nécessaires, utilisez ExtractAttachments.

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

Utilisez des critères de recherche pour filtrer les messages

Filtrage des messages à l’aide de critères de recherche réduit le nombre de messages chargés et améliore les performances.

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

Enregistrer les messages dans le flux

Au lieu d’extraire et d’enregistrer les messages un par un, utilisez SaveMessageToStream pour de meilleures performances.

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

Utilisez les méthodes en masse lorsque possible

Chaque fois que vous devez ajouter ou supprimer plusieurs éléments, privilégiez les méthodes en masse plutôt que les opérations individuelles. Cela réduit la surcharge et améliore les performances.