Работа с большими PST файлами
Contents
[
Hide
]
Производительность может снижаться при обработке больших PST файлов. Следующие рекомендации помогут улучшить производительность вашего приложения при обработке больших файлов.
Рассматривайте методы, возвращающие
Iterable
, при переборе папок или сообщений в pst.
try (PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
for (FolderInfo folder : pst.getRootFolder().enumerateFolders())
for (MessageInfo messageInfo : folder.enumerateMessages()) {
// Выполните что-то с сообщением
}
}
Предпочитайте MessageInfo для доступа к основным свойствам сообщения.
for (MessageInfo messageInfo : folder.enumerateMessages()) {
System.out.println("Тема: " + messageInfo.getSubject());
System.out.println("Кому: " + messageInfo.getDisplayTo());
System.out.println("Важно: " + messageInfo.getImportance());
System.out.println("Класс сообщения: " + messageInfo.getMessageClass());
}
Избегайте использования методов ExtractMessage или EnumerateMapiMessages для всех сообщений, если вам не нужен доступ ко всем свойствам.
Рассмотрите возможность использования EnumerateMessagesEntryId, чтобы легко получить все идентификаторы сообщений, содержащиеся в папке.
for (String id : folder.enumerateMessagesEntryId())
{
// Используйте id для получения свойства (extractProperty),
// извлечения MapiMessage (extractMessage),
// извлечения вложений сообщения (extractAttachments),
// сохранения сообщения в поток (saveMessageToStream).
}
Рассмотрите возможность использования 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();
}
Рассмотрите возможность использования ExtractAttachments, если нужны только вложения.
for (String msgId : folder.enumerateMessagesEntryId()) {
MapiAttachmentCollection attachments = pst.extractAttachments(msgId);
}
Используйте фильтрацию на основе критериев поиска, чтобы получить необходимые сообщения.
try (PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
// Непрочитанные сообщения
builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
for (FolderInfo folder : pst.getRootFolder().enumerateFolders()) {
MessageInfoCollection unread = folder.getContents(builder.getQuery());
}
}
Рассмотрите возможность использования SaveMessageToStream, если необходимо сохранять сообщения из pst.
Вместо использования:
for (String id : folder.enumerateMessagesEntryId()) {
MapiMessage msg = pst.extractMessage(id);
msg.save("message.msg");
}
Используйте:
for (String id : folder.enumerateMessagesEntryId()) {
try (OutputStream fos = new FileOutputStream("message.msg")) {
pst.saveMessageToStream(id, fos);
}
}
Предпочитайте массовые методы для добавления или удаления нескольких элементов.