Работа с големи PST файлове

Обработката на големи файлове Personal Storage Table (PST) може да намали производителността и да увеличи използването на памет. Aspose.Email за Java предоставя няколко техники и API-та, които позволяват на разработчиците да достъпват, обработват и управляват пощенските данни ефективно без да претоварват системните ресурси.

Използвайте итерираните методи за обхождане на папки и съобщения

При обхождане на папки и съобщения предпочитайте методи, които връщат Iterable. Това намалява натоварването на паметта и подобрява производителността.

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

Използвайте MessageInfo за основните свойства на съобщението

Ако ви трябват само основните детайли на съобщението, използвайте MessageInfo вместо да зареждате цялото съобщение. Това е по‑бързо и консумира по‑малко памет.

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

Избягвайте извличането на пълни съобщения, освен ако е необходимо

Не използвайте ExtractMessage или EnumerateMapiMessages методи за всички съобщения, освен ако не са ви нужни всички свойства.

Вместо това, разгледайте:

a) Извличане на ID‑та на съобщения

Използвайте enumerateMessagesEntryId за да получите всички ID‑та на съобщения в папка. Тогава можете избирателно да извлечете свойства, съобщения или прикачени файлове.

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) Извличане на едно свойство

Използвайте ExtractProperty ако ви е нужна само конкретна свойство, липсващо в 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) Извличане само на прикачени файлове

Ако са нужни само прикачени файлове, използвайте ExtractAttachments.

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

Използвайте критерии за търсене, за да филтрирате съобщения

Филтриране на съобщения с помощта на критерии за търсене намалява броя заредени съобщения и подобрява производителността.

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

Запазване на съобщения в поток

Вместо да извличате и запазвате съобщения едно по едно, използвайте SaveMessageToStream за по‑добра производителност.

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

Използвайте масови методи, когато е възможно

Всеки път, когато трябва да добави или изтриване множество елементи, предпочитайте масови методи вместо индивидуални операции. Това намалява натоварването и подобрява производителността.