Lavorare con file PST di grandi dimensioni

L’elaborazione di file di grandi dimensioni Personal Storage Table (PST) può ridurre le prestazioni e aumentare l’uso della memoria. Aspose.Email per Java fornisce diverse tecniche e API che consentono agli sviluppatori di accedere, elaborare e gestire i dati della casella di posta in modo efficiente senza sovraccaricare le risorse del sistema.

Usa metodi iterabili per attraversare cartelle e messaggi

Quando iteri attraverso cartelle e messaggi, preferisci i metodi che restituiscono Iterable. Questo riduce il consumo di memoria e migliora le prestazioni.

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

Usa MessageInfo per le proprietà di base del messaggio

Se hai bisogno solo dei dettagli di base del messaggio, usa MessageInfo invece di caricare il messaggio completo. Questo è più veloce e consuma meno 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());
}

Evita di estrarre messaggi completi a meno che non sia necessario

Non usare ExtractMessage oppure EnumerateMapiMessages metodi per tutti i messaggi a meno che tu non abbia bisogno di tutte le proprietà.

Invece, considera:

a) Recuperare gli ID dei messaggi

Usa enumerateMessagesEntryId per ottenere tutti gli ID dei messaggi in una cartella. Puoi quindi estrarre selettivamente proprietà, messaggi o allegati.

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) Estrarre una singola proprietà

Usa ExtractProperty se hai bisogno solo di una proprietà specifica mancante in 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) Estrarre solo gli allegati

Se sono necessari solo gli allegati, usa ExtractAttachments.

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

Usa criteri di ricerca per filtrare i messaggi

Filtrare i messaggi usando criteri di ricerca riduce il numero di messaggi caricati e migliora le prestazioni.

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

Salva messaggi su stream

Invece di estrarre e salvare i messaggi uno per uno, utilizza SaveMessageToStream per migliori prestazioni.

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

Usa metodi batch quando possibile

Ogni volta che è necessario aggiungi oppure elimina più elementi, preferisci metodi batch invece di operazioni individuali. Questo riduce l’overhead e migliora le prestazioni.