Arbeiten mit großen PST‑Dateien

Die Verarbeitung großer Personal Storage Table (PST)-Dateien kann die Leistung verringern und den Speicherverbrauch erhöhen. Aspose.Email für Java bietet mehrere Techniken und APIs, die Entwicklern ermöglichen, Mailbox-Daten effizient zuzugreifen, zu verarbeiten und zu verwalten, ohne Systemressourcen zu überlasten.

Verwenden Sie iterable Methoden zum Durchlaufen von Ordnern und Nachrichten

Beim Durchlaufen von Ordnern und Nachrichten bevorzugen Sie Methoden, die zurückgeben Iterable. Dies reduziert den Speicheraufwand und verbessert die Leistung.

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

Verwenden Sie MessageInfo für grundlegende Nachrichteneigenschaften

Wenn Sie nur grundlegende Nachrichteninformationen benötigen, verwenden Sie MessageInfo statt die vollständige Nachricht zu laden. Das ist schneller und verbraucht weniger Speicher.

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

Vermeiden Sie das Extrahieren vollständiger Nachrichten, sofern nicht nötig

Verwenden Sie nicht ExtractMessage oder EnumerateMapiMessages Methoden für alle Nachrichten, sofern Sie nicht alle Eigenschaften benötigen.

Stattdessen sollten Sie in Betracht ziehen:

a) Nachrichten‑IDs abrufen

Verwenden enumerateMessagesEntryId um alle Nachrichten‑IDs in einem Ordner zu erhalten. Sie können dann selektiv Eigenschaften, Nachrichten oder Anhänge extrahieren.

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) Einzelne Eigenschaft extrahieren

Verwenden ExtractProperty wenn Sie nur eine bestimmte Eigenschaft benötigen, die fehlt 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) Nur Anhänge extrahieren

Wenn nur Anhänge benötigt werden, verwenden Sie ExtractAttachments.

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

Suchkriterien zum Filtern von Nachrichten verwenden

Filtern von Nachrichten mit Suchkriterien reduziert die Anzahl geladener Nachrichten und verbessert die Leistung.

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

Nachrichten in Stream speichern

Anstatt Nachrichten einzeln zu extrahieren und zu speichern, verwenden Sie SaveMessageToStream für bessere Leistung.

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

Verwenden Sie nach Möglichkeit Bulk‑Methoden

Immer wenn Sie hinzufügen oder löschen mehrere Elemente – bevorzugen Sie Bulk‑Methoden gegenüber einzelnen Operationen. Das reduziert den Aufwand und verbessert die Leistung.