处理大型 PST 文件

处理大型个人存储表 (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());
}

除非必要,否则避免提取完整消息

不要使用 ExtractMessageEnumerateMapiMessages 针对所有消息的方法,除非您需要所有属性。

相反,考虑以下方案:

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

尽可能使用批量方法

每当您需要时 添加删除 多个项目时,优先使用批量方法而非单个操作。这可降低开销并提升性能。