สร้าง PSTใหม่, เพิ่มโฟลเดอร์ย่อยและข้อความ

นอกจากการวิเคราะห์ไฟล์ PST ที่มีอยู่แล้ว, Aspose.Email ยังให้วิธีการสร้างไฟล์ PST ตั้งแต่ต้น บทความนี้แสดงวิธีการสร้างไฟล์ Outlook PST และเพิ่มโฟลเดอร์ย่อยเข้าไป

  1. สร้างไฟล์ PST ใหม่.
  2. การเปลี่ยนคลาสคอนเทนเนอร์ของโฟลเดอร์.
  3. เพิ่มข้อความเป็นกลุ่มด้วยประสิทธิภาพที่ดีกว่า

ใช้ PersonalStorage คลาสเพื่อสร้างไฟล์ PST ที่ตำแหน่งใดตำแหน่งหนึ่งบนดิสก์ในเครื่อง. เพื่อสร้างไฟล์ PST ตั้งแต่ต้น:

  1. สร้าง PST ด้วย PersonalStorage.create() เมธอด.
  2. เพิ่มโฟลเดอร์ย่อยที่รากของไฟล์ PST โดยเข้าถึงโฟลเดอร์ Root แล้วเรียก addSubFolder() เมธอด.

โค้ดสแนปชอตต่อไปนี้แสดงวิธีสร้างไฟล์ PST และเพิ่มโฟลเดอร์ย่อยชื่อ Inbox.

// Create new PST
try (PersonalStorage pst = PersonalStorage.create(path, FileFormatVersion.Unicode)) {
    // Add new folder "Test"
    pst.getRootFolder().addSubFolder("Inbox");
}

สร้าง PST ที่มีขนาดมากกว่า 2Gb ด้วย OutputStream

ผู้ใช้ Aspose.Email สามารถปรับแต่งแคชภายในของ PST ได้โดยใช้คอนสตรัคเตอร์ PersonalStorage:

  • blockSize - ขนาดบล็อกที่เหมาะสมที่สุดสำหรับขยายบัฟเฟอร์แคช (เป็นไบต์).
PersonalStorage create(OutputStream stream, int blockSize, /*FileFormatVersion*/int version)

ลดขนาดข้อความและขนาดของไฟล์ PST ที่สร้าง

Aspose.Email มีความสามารถในการบีบอัดเนื้อหาในข้อความ ซึ่งช่วยลดขนาดข้อความได้ ซึ่งมีประโยชน์เป็นพิเศษเมื่อส่งข้อความขนาดใหญ่หรือเมื่อเผชิญกับข้อจำกัดของแบนด์วิธหรือพื้นที่เก็บข้อมูล เพื่อจุดประสงค์นี้ ไลบรารีได้ให้พารามิเตอร์การบีบอัดในเมธอดต่อไปนี้:

โค้ดสแนปชอตด้านล่างแสดงวิธีใช้การบีบอัด RTF เมื่อกำหนดเนื้อหา MAPI ของข้อความ:

MapiMessage msg = new MapiMessage("from@doamin.com", "to@domain.com", "subject", "body");
// set the html body and keep it compressed
// this will reduce the message size
msg.setBodyContent(htmlBody, BodyContentType.Html, true);

สร้าง PersonalStorage บนสตรีม SeekableByteChannel

Aspose.Email for Java ทำให้สามารถทำงานกับไฟล์ Personal Storage (PST) ด้วย java.nio.channels ได้ คุณสามารถสร้างอินสแตนซ์ PersonalStorage โดยใช้สตรีม SeekableByteChannel โค้ดสแนปชอตต่อไปนี้แสดงวิธีสร้างอินสแตนซ์ PersonalStorage จากสตรีม FileChannel, เพิ่มโฟลเดอร์ย่อยชื่อ "messageFolder" ไปยังโฟลเดอร์ราก, และนำเข้าข้อความจากไฟล์ในไดเรกทอรี "messageFolder":

try (RandomAccessFile raf = new RandomAccessFile("test.pst", "rw")) {
    FileChannel channel = raf.getChannel();
    try (PersonalStorage pst = PersonalStorage.create(channel, FileFormatVersion.Unicode)) {
        FolderInfo messageFolder = pst.getRootFolder().addSubFolder("messageFolder");

        for (File f : new File("messageFolder").listFiles()) {
            messageFolder.addMessage(MapiMessage.load(f.getAbsolutePath()));
        }
    }
}

การเปลี่ยนคลาสคอนเทนเนอร์ของโฟลเดอร์

บางครั้งจำเป็นต้องเปลี่ยนคลาสของโฟลเดอร์ ตัวอย่างทั่วไปคือเมื่อข้อความประเภทต่าง ๆ (การนัดหมาย, ข้อความ, ฯลฯ) ถูกเพิ่มในโฟลเดอร์เดียวกัน ในกรณีเช่นนั้นคลาสของโฟลเดอร์ต้องเปลี่ยนสำหรับทุกองค์ประกอบในโฟลเดอร์เพื่อให้แสดงผลอย่างถูกต้อง โค้ดสแนปชอตต่อไปนี้แสดงวิธีเปลี่ยนคลาสคอนเทนเนอร์ของโฟลเดอร์ใน PST เพื่อวัตถุประสงค์นี้.

try (PersonalStorage pst = PersonalStorage.fromFile("PersonalStorage1.pst")) {
    FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");

    folder.changeContainerClass("IPF.Note");
}

เพิ่มข้อความเป็นกลุ่มด้วยประสิทธิภาพที่ดีกว่า

การเพิ่มข้อความแต่ละรายการลงใน PST จะทำให้มีการดำเนินการ I/O เพิ่มขึ้นและอาจทำให้ประสิทธิภาพช้าลง สำหรับประสิทธิภาพที่ดีขึ้น สามารถเพิ่มข้อความลงใน PST เป็นโหมดกลุ่มเพื่อจำกัดการดำเนินการ I/O. ส่วน addMessages(Iterable messages) เมธอดนี้อนุญาตให้คุณเพิ่มข้อความเป็นกลุ่มและสามารถใช้ในสถานการณ์ต่อไปนี้ นอกจากนี้, MessageAdded เหตุการณ์เกิดขึ้นเมื่อมีข้อความถูกเพิ่มเข้าไปในโฟลเดอร์.

เพิ่มข้อความจาก PST อื่น

เพื่อเพิ่มข้อความจาก PST อื่น ให้ใช้ FolderInfo.enumerateMapiMessages() เมธอดที่คืนค่า Iterable<MapiMessage>:

try (PersonalStorage srcPst = PersonalStorage.fromFile("source.pst", false)) {
    try (PersonalStorage destPst = PersonalStorage.fromFile("destination.pst")) {

        // Get the folder by name
        FolderInfo srcFolder = srcPst.getRootFolder().getSubFolder("SomeFolder");
        FolderInfo destFolder = destPst.getRootFolder().getSubFolder("SomeFolder");

        destFolder.MessageAdded.add(new MessageAddedEventHandler() {
            // Handles the MessageAdded event.
            public void invoke(Object sender, MessageAddedEventArgs e) {
                System.out.println("Added: " + e.getEntryId());
            }
        });
        destFolder.addMessages(srcFolder.enumerateMapiMessages());
    }
}

เพิ่มข้อความจากไดเรกทอรี

เพื่อเพิ่มข้อความจากไดเรกทอรี ให้สร้าง getMessages(String pathToDir) เมธอดที่คืนค่า Iterable<MapiMessage>:

// Read messages from directory.
static Iterable<MapiMessage> getMessages (String pathToDir)
{
    return Arrays.stream(listDirectory(pathToDir, "*.msg"))
            .map(MapiMessage::load).collect(Collectors.toList());
}

try ( PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
    FolderInfo folder = pst.getRootFolder().getSubFolder("SomeFolder");
    folder.MessageAdded.add(new MessageAddedEventHandler() {
        // Handles the MessageAdded event.
        public void invoke(Object sender, MessageAddedEventArgs e) {
            System.out.println("Added: " + e.getEntryId());
        }
    });
    folder.addMessages(getMessages("MessageDirectory"));
}