Làm việc với các tệp PST lớn

Xử lý các tệp Personal Storage Table (PST) lớn có thể làm giảm hiệu suất và tăng mức sử dụng bộ nhớ. Aspose.Email cho Java cung cấp nhiều kỹ thuật và API cho phép các nhà phát triển truy cập, xử lý và quản lý dữ liệu hộp thư một cách hiệu quả mà không gây tải quá mức cho tài nguyên hệ thống.

Sử dụng Các Phương pháp Iterable để Duyệt Thư mục và Tin nhắn

Khi lặp qua các thư mục và tin nhắn, nên ưu tiên các phương pháp trả về Iterable. Điều này giảm tải bộ nhớ và cải thiện hiệu suất.

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

Sử dụng MessageInfo cho các Thuộc tính Tin nhắn Cơ bản

Nếu bạn chỉ cần chi tiết tin nhắn cơ bản, hãy sử dụng MessageInfo thay vì tải toàn bộ tin nhắn. Cách này nhanh hơn và tiêu tốn ít bộ nhớ hơn.

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

Tránh Trích xuất Toàn bộ Tin nhắn trừ khi cần thiết

Không sử dụng ExtractMessage hoặc EnumerateMapiMessages phương pháp cho tất cả tin nhắn trừ khi bạn cần mọi thuộc tính.

Thay vào đó, hãy xem xét:

a) Lấy ID Tin nhắn

Sử dụng enumerateMessagesEntryId để lấy tất cả ID tin nhắn trong một thư mục. Sau đó bạn có thể trích xuất chọn lọc các thuộc tính, tin nhắn hoặc đính kèm.

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) Trích xuất một Thuộc tính Đơn

Sử dụng ExtractProperty nếu bạn chỉ cần một thuộc tính cụ thể còn thiếu trong 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) Chỉ Trích xuất Đính kèm

Nếu chỉ cần tệp đính kèm, hãy sử dụng ExtractAttachments.

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

Sử dụng Tiêu chí Tìm kiếm để Lọc Tin nhắn

Lọc tin nhắn bằng cách sử dụng tiêu chí tìm kiếm giảm số lượng tin nhắn được tải và cải thiện hiệu suất.

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

Lưu Tin nhắn vào Stream

Thay vì trích xuất và lưu từng tin nhắn một, hãy sử dụng SaveMessageToStream để hiệu suất tốt hơn.

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

Sử dụng phương pháp Bulk khi có thể

Khi nào bạn cần thêm hoặc xóa nhiều mục, ưu tiên các phương pháp bulk hơn các thao tác riêng lẻ. Điều này giảm tải và cải thiện hiệu suất.