Praca z dużymi plikami PST

Przetwarzanie dużych plików Personal Storage Table (PST) może obniżać wydajność i zwiększać zużycie pamięci. Aspose.Email for Java oferuje kilka technik i interfejsów API, które umożliwiają programistom efektywny dostęp, przetwarzanie i zarządzanie danymi skrzynki pocztowej bez nadmiernego obciążania zasobów systemu.

Używaj iterowalnych metod do przeglądania folderów i wiadomości

Podczas iteracji przez foldery i wiadomości, preferuj metody, które zwracają Iterable. To zmniejsza zużycie pamięci i poprawia wydajność.

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

Użyj MessageInfo do podstawowych właściwości wiadomości

Jeśli potrzebujesz tylko podstawowych szczegółów wiadomości, użyj MessageInfo zamiast ładować pełną wiadomość. To jest szybsze i zużywa mniej pamięci.

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

Unikaj wyodrębniania pełnych wiadomości, chyba że to konieczne

Nie używaj ExtractMessage lub EnumerateMapiMessages metody dla wszystkich wiadomości, chyba że potrzebujesz wszystkich właściwości.

Zamiast tego rozważ:

a) Pobieranie identyfikatorów wiadomości

Użyj enumerateMessagesEntryId aby uzyskać wszystkie identyfikatory wiadomości w folderze. Następnie możesz selektywnie wyodrębniać właściwości, wiadomości lub załączniki.

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) Wyodrębnianie jednej właściwości

Użyj ExtractProperty jeśli potrzebujesz tylko konkretnej właściwości, której brakuje w 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) Wyodrębnianie tylko załączników

Jeśli potrzebne są tylko załączniki, użyj ExtractAttachments.

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

Użyj kryteriów wyszukiwania, aby filtrować wiadomości

Filtrowanie wiadomości przy użyciu kryteria wyszukiwania zmniejsza liczbę wczytywanych wiadomości i poprawia wydajność.

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

Zapisz wiadomości do strumienia

Zamiast wyodrębniać i zapisywać wiadomości pojedynczo, użyj SaveMessageToStream dla lepszej wydajności.

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

Używaj metod masowych, gdy to możliwe

Kiedy tylko potrzebujesz dodaj lub usuń wiele elementów, preferuj metody masowe zamiast operacji pojedynczych. Redukuje to narzut i poprawia wydajność.