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.