Робота з великими PST‑файлами

Обробка великих файлів Personal Storage Table (PST) може знизити продуктивність і збільшити використання пам’яті. Aspose.Email for 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) Отримання ідентифікаторів листів

Використати enumerateMessagesEntryId щоб отримати всі ідентифікатори листів у папці. Потім можна вибірково вилучати властивості, листи або вкладення.

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

Використовуйте масові методи, коли це можливо

Коли вам потрібно додати або видалити кілька елементів, віддавайте перевагу масовим методам замість окремих операцій. Це зменшує навантаження і підвищує продуктивність.