Работа с крупными 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);
    }
}

Используйте массовые методы, когда это возможно

Когда вам нужно добавить или delete многих элементов, предпочтительно использовать массовые методы вместо отдельных операций. Это снижает нагрузку и повышает производительность.