Bekerja dengan Pesan di File PST

Menambahkan Pesan ke File PST

Buat File PST Baru dan Tambahkan Subfolder menunjukkan cara membuat file PST dan menambahkan subfolder ke dalamnya. Dengan Aspose.Email Anda dapat menambahkan pesan ke subfolder file PST yang telah Anda buat atau muat. Artikel ini menambahkan dua pesan dari disk ke subfolder Inbox dari PST. Gunakan PersonalStorage dan FolderInfo kelas untuk menambahkan pesan ke file PST. Untuk menambahkan pesan ke folder Inbox file PST:

  1. Buat instance dari kelas FolderInfo dan muat dengan konten folder Inbox.
  2. Tambahkan pesan dari disk ke folder Inbox dengan memanggil FolderInfo.addMessage() metode. FolderInfo kelas mengekspos addMessages metode yang memungkinkan menambahkan sejumlah besar pesan ke folder, mengurangi operasi I/O ke disk dan meningkatkan kinerja. Contoh lengkap dapat ditemukan di bawah, dalam Menambahkan Pesan Secara Bulk.

Cuplikan kode di bawah ini menunjukkan cara menambahkan pesan ke subfolder PST yang bernama Inbox.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

// Create new PST
PersonalStorage personalStorage = PersonalStorage.create(dataDir, FileFormatVersion.Unicode);

// Add new folder "Inbox"
personalStorage.getRootFolder().addSubFolder("Inbox");

// Select the "Inbox" folder
FolderInfo inboxFolder = personalStorage.getRootFolder().getSubFolder("Inbox");

// Add some messages to "Inbox" folder
inboxFolder.addMessage(MapiMessage.fromFile(dataDir + "MapiMsgWithPoll.msg"));

Menambahkan Pesan Secara Bulk

Menambahkan pesan individu ke PST berarti lebih banyak operasi I/O ke disk dan dapat memperlambat kinerja. Untuk meningkatkan kinerja, pesan dapat ditambahkan ke PST secara bulk untuk meminimalkan operasi I/O. The addMessages(Iterable messages) metode memungkinkan Anda menentukan rentang pesan yang akan ditambahkan ke PST untuk meningkatkan kinerja dan dapat digunakan dalam skenario berikut. Selain itu, peristiwa MessageAdded terjadi ketika sebuah pesan ditambahkan ke folder.

Memuat Pesan dari Disk

Cuplikan kode berikut menunjukkan cara memuat pesan dari disk.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void addMessagesInBulkMode(String fileName, String msgFolderName) {
    try (PersonalStorage personalStorage = PersonalStorage.fromFile(fileName)) {
        FolderInfo folder = personalStorage.getRootFolder().getSubFolder("myInbox");
        folder.MessageAdded.add(new MessageAddedEventHandler() {
            public void invoke(Object sender, MessageAddedEventArgs e) {
                onMessageAdded(sender, e);
            }
        });
        folder.addMessages(new MapiMessageCollection(msgFolderName));
    }
}

static void onMessageAdded(Object sender, MessageAddedEventArgs e) {
    System.out.println(e.getEntryId());
    System.out.println(e.getMessage().getSubject());
}

Implementasi Iterable

Cuplikan kode berikut menunjukkan cara membuat Implementasi Iterable.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public class MapiMessageCollection implements Iterable<MapiMessage> {

    private final File folder;

    public MapiMessageCollection(String folder) {
        this.folder = new File(folder);
    }

    public Iterator<MapiMessage> iterator() {
        return new MapiMessageIterator(folder.listFiles());
    }
}

public class MapiMessageIterator implements Iterator<MapiMessage> {

    private Queue<String> queue = new LinkedList<String>();

    public MapiMessageIterator(File[] listOfFiles) {
        for (File file : listOfFiles) {
            queue.offer(file.getAbsolutePath());
        }
    }

    public boolean hasNext() {
        return !queue.isEmpty();
    }

    public MapiMessage next() {
        return MapiMessage.fromFile(queue.poll());
    }
}

Menambahkan Pesan dari PST Lain

Untuk menambahkan pesan dari PST lain, gunakan FolderInfo.enumerateMapiMessages() metode yang mengembalikan Iterable. Potongan kode berikut menunjukkan cara menambahkan pesan dari PST lain.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void bulkAddFromAnotherPst(String source) {
    // The path to the File directory.
    String dataDir = "data/";

    try (PersonalStorage pst = PersonalStorage.fromFile(source, false)) {
        try (PersonalStorage pstDest = PersonalStorage.fromFile(dataDir + "PersonalStorageFile1.pst")) {
            // Get the folder by name
            FolderInfo folderInfo = pst.getRootFolder().getSubFolder("Contacts");
            MessageInfoCollection ms = folderInfo.getContents();

            // Get the folder by name
            FolderInfo f = pstDest.getRootFolder().getSubFolder("myInbox");
            f.MessageAdded.add(new MessageAddedEventHandler() {
                public void invoke(Object sender, MessageAddedEventArgs e) {
                    onMessageAdded(sender, e);
                }
            });
            f.addMessages(folderInfo.enumerateMapiMessages());
            FolderInfo fi = pstDest.getRootFolder().getSubFolder("myInbox");
            MessageInfoCollection msgs = fi.getContents();
        }
    }
}

// Handles the MessageAdded event.
static void onMessageAdded(Object sender, MessageAddedEventArgs e) {
    System.out.println(e.getEntryId());
    System.out.println(e.getMessage().getSubject());
}

Dapatkan Informasi Pesan dari File Outlook PST

Di Baca File Outlook PST dan Dapatkan Informasi Folder serta Subfolder, kami membahas memuat file Outlook PST dan menelusuri foldernya untuk mendapatkan nama folder serta jumlah pesan di dalamnya. Artikel ini menjelaskan cara membaca semua folder dan subfolder dalam file PST serta menampilkan informasi tentang pesan, misalnya subjek, pengirim, dan penerima. FolderInfo.getContents() metode digunakan untuk menampilkan informasi singkat pesan seperti subjek, pengirim, penerima. Dari segi kinerja, ini adalah opsi paling cocok untuk memperoleh informasi utama tentang pesan. Untuk ekstrak data pesan lengkap, PersonalStorage.extractMessage() metode disediakan. File Outlook PST mungkin berisi folder bersarang. Untuk mendapatkan informasi pesan dari folder tersebut, serta folder tingkat atas, gunakan metode rekursif untuk membaca semua folder. Potongan kode berikut menunjukkan cara membaca file Outlook PST dan menampilkan isi folder serta pesan secara rekursif.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
    // The path to the File directory.
    String dataDir = "data/";

    // Load the Outlook file
    String path = dataDir + "PersonalStorage.pst";

    try {

        // Load the Outlook PST file
        PersonalStorage personalStorage = PersonalStorage.fromFile(path);

        // Get the Display Format of the PST file
        System.out.println("Display Format: " + personalStorage.getFormat());

        // Get the folders and messages information
        FolderInfo folderInfo = personalStorage.getRootFolder();

        // Call the recursive method to display the folder contents
        displayFolderContents(folderInfo, personalStorage);
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

// This is a recursive method to display contents of a folder
private static void displayFolderContents(FolderInfo folderInfo, PersonalStorage pst) {
    // Display the folder name
    System.out.println("Folder: " + folderInfo.getDisplayName());
    System.out.println("==================================");
    // Display information about messages inside this folder
    MessageInfoCollection messageInfoCollection = folderInfo.getContents();
    for (MessageInfo messageInfo : messageInfoCollection) {
        System.out.println("Subject: " + messageInfo.getSubject());
        System.out.println("Sender: " + messageInfo.getSenderRepresentativeName());
        System.out.println("Recipients: " + messageInfo.getDisplayTo());
        System.out.println("------------------------------");
    }

    // Call this method recursively for each subfolder
    if (folderInfo.hasSubFolders() == true) {
        for (FolderInfo subfolderInfo : folderInfo.getSubFolders()) {
            displayFolderContents(subfolderInfo, pst);
        }
    }
}

Mengekstrak Pesan dari File PST

Artikel ini menunjukkan cara membaca file Microsoft Outlook PST dan mengekstrak pesan. Pesan-pesan kemudian disimpan ke disk dalam format MSG. Artikel juga menunjukkan cara ekstrak sejumlah pesan tertentu dari file PST. Gunakan metode rekursif untuk menelusuri semua folder (termasuk folder bersarang) dan panggil PersonalStorage.extractMessage() metode untuk mendapatkan pesan Outlook ke dalam instance MapiMessage kelas. Setelah itu, panggil MapiMessage.save() metode untuk menyimpan pesan ke disk atau stream dalam format MSG. Potongan kode berikut menunjukkan cara mengekstrak pesan dari file PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
    // The path to the File directory.
    String dataDir = "data/";

    // Load the Outlook file
    String path = dataDir + "PersonalStorage.pst";

    try {
        // load the Outlook PST file
        PersonalStorage pst = PersonalStorage.fromFile(path);

        // get the Display Format of the PST file
        System.out.println("Display Format: " + pst.getFormat());

        // get the folders and messages information
        FolderInfo folderInfo = pst.getRootFolder();

        // Call the recursive method to extract msg files from each folder
        extractMsgFiles(folderInfo, pst);
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

// This is a recursive method to display contents of a folder
private static void extractMsgFiles(FolderInfo folderInfo, PersonalStorage pst) {
    // display the folder name
    System.out.println("Folder: " + folderInfo.getDisplayName());
    System.out.println("==================================");
    // loop through all the messages in this folder
    MessageInfoCollection messageInfoCollection = folderInfo.getContents();
    for (MessageInfo messageInfo : messageInfoCollection) {
        System.out.println("Saving message {0} ...." + messageInfo.getSubject());
        // get the message in MapiMessage instance
        MapiMessage message = pst.extractMessage(messageInfo);
        // save this message to disk in msg format
        message.save(message.getSubject().replace(":", " ") + ".msg");
        // save this message to stream in msg format
        ByteArrayOutputStream messageStream = new ByteArrayOutputStream();
        message.save(messageStream);
    }

    // Call this method recursively for each subfolder
    if (folderInfo.hasSubFolders() == true) {
        for (FolderInfo subfolderInfo : folderInfo.getSubFolders()) {
            extractMsgFiles(subfolderInfo, pst);
        }
    }
}

Menyimpan Pesan Langsung dari PST ke Stream

Untuk menyimpan pesan dari file PST langsung ke stream, tanpa mengekstrak MsgInfo untuk pesan, gunakan saveMessageToStream() metode. Potongan kode berikut menunjukkan cara menyimpan pesan secara langsung dari PST ke stream.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";

// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";

// Save message to MemoryStream
try (PersonalStorage personalStorage = PersonalStorage.fromFile(path)) {
    FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
    for (MessageInfo messageInfo : inbox.enumerateMessages()) {
        try (ByteArrayOutputStream memeorystream = new ByteArrayOutputStream()) {
            personalStorage.saveMessageToStream(messageInfo.getEntryIdString(), memeorystream);
        }
    }
}

// Save message to file
try (PersonalStorage pst = PersonalStorage.fromFile(path)) {
    FolderInfo inbox = pst.getRootFolder().getSubFolder("Inbox");
    for (MessageInfo messageInfo : inbox.enumerateMessages()) {
        try (FileOutputStream fs = new FileOutputStream(new File(dataDir + messageInfo.getSubject() + ".msg"))) {
            pst.saveMessageToStream(messageInfo.getEntryIdString(), fs);
        }
    }
}

try (PersonalStorage pst = PersonalStorage.fromFile(path)) {
    FolderInfo inbox = pst.getRootFolder().getSubFolder("Inbox");

    // To enumerate entryId of messages you may use FolderInfo.EnumerateMessagesEntryId() method:
    for (String entryId : inbox.enumerateMessagesEntryId()) {
        try (ByteArrayOutputStream ms = new ByteArrayOutputStream()) {
            pst.saveMessageToStream(entryId, ms);
        }
    }
}

Mengekstrak n Jumlah Pesan dari File PST

Potongan kode berikut menunjukkan cara mengekstrak sejumlah pesan tertentu dari PST. Cukup berikan indeks untuk pesan pertama, dan total jumlah pesan yang akan diekstrak.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");

// Extracts messages starting from 10th index top and extract total 100 messages
MessageInfoCollection messages = inbox.getContents(10, 100);

Dapatkan Total Jumlah Item dari File PST

Aspose.Email menyediakan GetTotalItemsCount() metode dari PersonalStorage.Store properti. Mengembalikan total jumlah item pesan yang terdapat dalam PST.

Contoh kode berikut menunjukkan cara mengambil total jumlah item (pesan, janji, kontak, dll.) yang disimpan dalam file PST:

try (PersonalStorage pst = PersonalStorage.fromFile("my.pst", false)) {
    int count = pst.getStore().getTotalItemsCount();
}

Hapus Item dari File PST

Add Messages to PST Files menunjukkan cara menambahkan pesan ke file PST. Tentu saja, juga dimungkinkan untuk menghapus item (isi) dari file PST dan mungkin diinginkan untuk menghapus pesan secara massal. Item dari file PST dapat dihapus menggunakan FolderInfo.deleteChildItem() metode. API juga menyediakan FolderInfo.deleteChildItems() metode untuk menghapus item secara massal dari file PST.

Menghapus Pesan dari File PST

Artikel ini menunjukkan cara Menggunakan FolderInfo kelas untuk mengakses folder spesifik dalam file PST. Untuk menghapus pesan dari subfolder Sent pada file PST yang telah dimuat atau dibuat sebelumnya:

  1. Buat sebuah instansi dari FolderInfo kelas dan memuatnya dengan isi subfolder sent.
  2. Hapus pesan dari folder Sent dengan memanggil FolderInfo.deleteChildItem() metode dan melewatkan MessageInfo.EntryId sebagai parameter. Potongan kode berikut menunjukkan cara menghapus pesan dari subfolder Sent pada file PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";

// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir);

// Get the Sent items folder
FolderInfo folderInfo = personalStorage.getPredefinedFolder(StandardIpmFolder.SentItems);

MessageInfoCollection msgInfoColl = folderInfo.getContents();
for (MessageInfo msgInfo : msgInfoColl) {
    System.out.println(msgInfo.getSubject() + ": " + msgInfo.getEntryIdString());
    if (msgInfo.getSubject().equals("some delete condition")) {
        // Delete this item
        folderInfo.deleteChildItem(msgInfo.getEntryId());
        System.out.println("Deleted this message");
    }
}

Menghapus Folder dari File PST

Anda dapat menghapus folder PST dengan memindahkannya ke folder Item Dihapus.

try (PersonalStorage pst = PersonalStorage.fromFile("test.pst")) {
    FolderInfo deletedItemsFolder = pst.getPredefinedFolder(StandardIpmFolder.DeletedItems);
    FolderInfo emptyFolder = pst.getRootFolder().getSubFolder("Empty folder");
    FolderInfo someFolder = pst.getRootFolder().getSubFolder("Some folder");
    pst.moveItem(emptyFolder, deletedItemsFolder);
    pst.moveItem(someFolder, deletedItemsFolder);
}

Keuntungan metode ini adalah folder yang dihapus dapat dipulihkan dengan mudah.

FolderInfo someFolder = deletedItemsFolder.getSubFolder("Some folder");
pst.moveItem(someFolder, pst.getRootFolder());

Anda juga dapat menghapus folder secara permanen dari folder Item Dihapus, jika diperlukan.

deletedItemsFolder.deleteChildItem(emptyFolder.getEntryId());

The deleteChildItem() metode dapat digunakan untuk folder apa pun jika Anda ingin segera dan secara permanen menghapus subfolder, melewati folder Item Dihapus.

FolderInfo someFolder = pst.getRootFolder().getSubFolder("Some folder");
pst.getRootFolder().deleteChildItem(someFolder.getEntryId());

Hapus Item secara Massal dari File PST

API Aspose.Email dapat digunakan untuk menghapus item secara massal dari file PST. Ini dicapai dengan menggunakan deleteChildItems() metode yang menerima daftar item Entry ID yang merujuk pada item yang akan dihapus. Potongan kode berikut menunjukkan cara menghapus Item secara massal dari file PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";

try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir)) {
    // Get Inbox SubFolder from Outlook file
    FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");

    // Create instance of PersonalStorageQueryBuilder
    PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();

    queryBuilder.getFrom().contains("someuser@domain.com");
    MessageInfoCollection messages = inbox.getContents(queryBuilder.getQuery());
    List<String> deleteList = new ArrayList<String>();
    for (MessageInfo messageInfo : messages) {
        deleteList.add(messageInfo.getEntryIdString());
    }

    // delete messages having From = "someuser@domain.com"
    inbox.deleteChildItems(deleteList);
}

Menelusuri dan Memulihkan Pesan yang Dihapus Secara Lunak dari PST

Dimungkinkan untuk mengambil pesan yang dihapus secara permanen dengan Aspose.Email untuk Java. API-nya memungkinkan Anda menelusuri pesan yang dihapus secara lunak dalam file PST. Item yang dihapus secara lunak adalah pesan yang dihapus dua kali - pertama dipindahkan ke folder Item Dihapus dan kemudian dihapus dari sana. Pesan-pesan ini masih dapat dipulihkan, dan Aspose.Email menyediakan cara yang nyaman untuk mengaksesnya. PersonalStorage.findAndEnumerateSoftDeletedItems() metode mengembalikan koleksi RestoredItemEntry objek. Setiap entri berisi:

  • MapiMessage item — pesan yang dipulihkan.
  • String FolderId - pengidentifikasi folder tempat pesan asalnya.

Contoh kode berikut menunjukkan cara menelusuri item email yang dihapus secara lunak (dapat dipulihkan) dalam file PST:

// Load the PST file
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
    // Enumerate soft-deleted items
    for (RestoredItemEntry entry : pst.findAndEnumerateSoftDeletedItems()) {
        MapiMessage message = entry.getItem();
        String folderId = entry.getFolderId();
        
        System.out.println("Subject: " + message.getSubject());
        System.out.println("Deleted from Folder ID: " + folderId);
        System.out.println("-----------------------------------");
    }
}

Cari Pesan dan Folder dalam PST berdasarkan Kriteria

File Personal Storage (PST) dapat berisi sejumlah besar data dan pencarian data yang memenuhi kriteria tertentu dalam file besar seperti itu perlu menyertakan beberapa titik pemeriksaan dalam kode untuk menyaring informasi. Dengan PersonalStorageQueryBuilder kelas, Aspose.Email memungkinkan pencarian rekaman spesifik dalam PST berdasarkan kriteria pencarian yang ditentukan. PST dapat dicari pesan berdasarkan parameter pencarian seperti pengirim, penerima, subjek, pentingnya pesan, keberadaan lampiran, ukuran pesan, dan bahkan ID pesan. PersonalStorageQueryBuilder juga dapat digunakan untuk mencari subfolder.

Mencari Pesan dan Folder dalam PST

Potongan kode berikut menunjukkan cara menggunakan PersonalStorageQueryBuilder kelas untuk mencari konten dalam PST berdasarkan kriteria pencarian yang berbeda. Misalnya, menunjukkan pencarian PST berdasarkan:

  • Pentingnya pesan.
  • Kelas pesan.
  • Kehadiran lampiran.
  • Ukuran pesan.
  • Tanggal pesan.
  • Pesan belum dibaca.
  • Pesan belum dibaca dengan lampiran, dan
  • folder dengan nama subfolder tertentu.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";

try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir + "Outlook.pst")) {
    FolderInfo folder = personalStorage.getRootFolder().getSubFolder("Inbox");
    PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();

    // High importance messages
    builder.getImportance().equals((int) MapiImportance.High);
    MessageInfoCollection messages = folder.getContents(builder.getQuery());
    System.out.println("Messages with High Imp:" + messages.size());

    builder = new PersonalStorageQueryBuilder();
    builder.getMessageClass().equals("IPM.Note");
    messages = folder.getContents(builder.getQuery());
    System.out.println("Messages with IPM.Note:" + messages.size());

    builder = new PersonalStorageQueryBuilder();
    // Messages with attachments AND high importance
    builder.getImportance().equals((int) MapiImportance.High);
    builder.hasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
    messages = folder.getContents(builder.getQuery());
    System.out.println("Messages with atts: " + messages.size());

    builder = new PersonalStorageQueryBuilder();
    // Messages with size > 15 KB
    builder.getMessageSize().greater(15000);
    messages = folder.getContents(builder.getQuery());
    System.out.println("messags size > 15Kb:" + messages.size());

    java.util.Calendar c = java.util.Calendar.getInstance();

    builder = new PersonalStorageQueryBuilder();
    // Messages by Current Date
    // (Note that queries by date are not supported for Calendar Items in the Appointments folder)
    builder.getSentDate().on(c.getTime(), DateComparisonType.ByDate);
    messages = folder.getContents(builder.getQuery());
    System.out.println("Messages by Current Date: " + messages.size());

    builder = new PersonalStorageQueryBuilder();
    // Messages between Dates
    // (Note that queries by date are not supported for Calendar Items in the Appointments folder)
    c.set(2020,  0, 1, 0, 0, 0);
    builder.getSentDate().since(c.getTime());
    c.set(2021,  0, 1, 0, 0, 0);
    builder.getSentDate().before(c.getTime());
    messages = folder.getContents(builder.getQuery());
    System.out.println("Messages between Dates: " + messages.size());

    builder = new PersonalStorageQueryBuilder();
    // Unread messages
    builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
    messages = folder.getContents(builder.getQuery());
    System.out.println("Unread:" + messages.size());

    builder = new PersonalStorageQueryBuilder();
    // Unread messages with attachments
    builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
    builder.hasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
    messages = folder.getContents(builder.getQuery());
    System.out.println("Unread msgs with atts: " + messages.size());

    // Folder with name of 'SubInbox'
    builder = new PersonalStorageQueryBuilder();
    builder.getFolderName().equals("SubInbox");
    FolderInfoCollection folders = folder.getSubFolders(builder.getQuery());
    System.out.println("Folder having subfolder: " + folders.size());

    builder = new PersonalStorageQueryBuilder();
    // Folders with subfolders
    builder.hasSubfolders();
    folders = folder.getSubFolders(builder.getQuery());
    System.out.println(folders.size());
}

Mencari String dalam PST dengan Parameter Ignore Case

Potongan kode berikut menunjukkan cara mencari string dalam PST dengan parameter mengabaikan huruf besar/kecil.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";

try (PersonalStorage personalStorage = PersonalStorage.create(dataDir + "CaseSensitivity.pst", FileFormatVersion.Unicode)) {
    FolderInfo folderinfo = personalStorage.createPredefinedFolder("Inbox", StandardIpmFolder.Inbox);
    folderinfo.addMessage(MapiMessage.fromMailMessage(MailMessage.load("Sample.eml")));
    PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
    // IgnoreCase is True
    builder.getFrom().contains("automated", true);
    MailQuery query = builder.getQuery();
    MessageInfoCollection coll = folderinfo.getContents(query);
    System.out.println(coll.size());
}

Mencari Subjek Pesan dengan Beberapa Kata Kunci dalam File PST

Anda dapat menggunakan MailQueryBuilder.or metode untuk menemukan pesan dengan subjek yang mengandung setidaknya satu kata yang ditentukan seperti ditunjukkan di bawah:

PersonalStorageQueryBuilder builder1 = new PersonalStorageQueryBuilder();
builder1.getSubject().contains("Review"); // 'Review' is key word for the search

PersonalStorageQueryBuilder builder2 = new PersonalStorageQueryBuilder();
builder2.getSubject().contains("Error"); // 'Error' is also key word for the search

PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.or(builder1.getQuery(), builder2.getQuery()); // message subjects must contain 'Review' or 'Error' words

try (PersonalStorage storage = PersonalStorage.fromFile("example.pst"))
{
    FolderInfo folderInfo = storage.getRootFolder().getSubFolder("Inbox");
    MessageInfoCollection messageInfos = folderInfo.getContents(queryBuilder.getQuery());

    for (MessageInfo messageInfo : messageInfos)
    {
        System.out.println(messageInfo.getSubject());
    }
}

Pengambilan Berhalaman Isi Folder PST

Tingkatkan kinerja aplikasi Anda dan kontrol saat menavigasi folder besar. Ambil isi folder secara berhalaman menggunakan overload Aspose.Email dari getContents metode. Metode ini - FolderInfo.getContents(MailQuery query, int startIndex, int count) - mengambil subset pesan yang cocok dengan kueri yang ditentukan, mulai dari indeks tertentu dan dibatasi oleh jumlah. Contoh kode berikut menunjukkan pengambilan berhalaman dan pemrosesan pesan yang difilter dari folder PST:

// Load the PST file
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
    // Access a specific subfolder
    FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");

    // Build a query to filter messages by sender address
    PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
    queryBuilder.getFrom().contains("report-service", true);

    // Define the page size
    int pageSize = 5;

    // Retrieve and process messages in pages
    for (int pageIndex = 0; pageIndex < 6; pageIndex++) {
        int startIndex = pageIndex * pageSize;

        // Get a page of messages
        MessageInfoCollection messages = folder.getContents(queryBuilder.getQuery(), startIndex, pageSize);

        for (MessageInfo messageInfo : messages) {
            // Output basic info about each message
            System.out.println("Subject: " + messageInfo.getSubject() + ", Sender: " + messageInfo.getSenderRepresentativeName());
        }
    }
}

Memindahkan Item ke Folder Lain dalam File PST

Aspose.Email memungkinkan memindahkan item dari folder sumber ke folder lain dalam file Personal Storage (PST) yang sama. Ini mencakup:

  • Memindahkan folder tertentu ke folder induk baru.
  • Memindahkan pesan tertentu ke folder baru.
  • Memindahkan isi ke folder baru.
  • Memindahkan subfolder ke folder induk baru.

Potongan kode berikut menunjukkan cara memindahkan item seperti pesan dan folder dari folder sumber ke folder lain dalam file PST yang sama.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
try (PersonalStorage personalStorage = PersonalStorage.fromFile("test.pst")) {
    FolderInfo inbox = personalStorage.getPredefinedFolder(StandardIpmFolder.Inbox);
    FolderInfo deleted = personalStorage.getPredefinedFolder(StandardIpmFolder.DeletedItems);
    FolderInfo subfolder = inbox.getSubFolder("Subfolder");

    // Move folder and message to the Deleted Items
    personalStorage.moveItem(subfolder, deleted);
    MessageInfoCollection contents = subfolder.getContents();
    personalStorage.moveItem(contents.get(0), deleted);

    // Move all inbox subfolders and subfolder contents to the Deleted Items
    inbox.moveSubfolders(deleted);
    subfolder.moveContents(deleted);
}

Memperbarui Properti Pesan dalam File PST

Terkadang diperlukan untuk memperbarui properti tertentu dari pesan seperti mengubah subjek, menandai pentingnya pesan, dan sebagainya. Memperbarui pesan dalam file PST dengan perubahan properti pesan tersebut dapat dilakukan menggunakan FolderInfo.changeMessages metode. Artikel ini menunjukkan cara memperbarui pesan secara massal dalam file PST untuk perubahan properti. Potongan kode berikut menunjukkan cara memperbarui properti pesan dalam mode massal untuk beberapa pesan dalam file PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";

// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir);

// Get Requierd Subfolder
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");

// find messages having From = "someuser@domain.com"
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("someuser@domain.com");

// Get Contents from Query
MessageInfoCollection messages = inbox.getContents(queryBuilder.getQuery());

// Save (MessageInfo,EntryIdString) in List
List<String> changeList = new ArrayList<String>();
for (MessageInfo messageInfo : messages) {
    changeList.add(messageInfo.getEntryIdString());
}

// Compose the new properties
MapiPropertyCollection updatedProperties = new MapiPropertyCollection();
updatedProperties.add(MapiPropertyTag.PR_SUBJECT_W, new MapiProperty(MapiPropertyTag.PR_SUBJECT_W, "New Subject".getBytes(Charset.forName("utf-16le"))));
updatedProperties.add(MapiPropertyTag.PR_IMPORTANCE, new MapiProperty(MapiPropertyTag.PR_IMPORTANCE, BitConverter.getBytesInt64(2)));

// update messages having From = "someuser@domain.com" with new properties
inbox.changeMessages(changeList, updatedProperties);

Memperbarui Properti Kustom dalam File PST

Terkadang diperlukan untuk menandai item yang telah diproses dalam file PST. API Aspose.Email memungkinkan hal ini menggunakan MapiProperty dan MapiNamedProperty. Metode berikut sangat membantu untuk mencapainya.

  • constructor MapiNamedProperty(long propertyTag, String nameIdentifier, UUID propertyGuid, byte[] propertyValue)
  • constructor MapiNamedProperty(long propertyTag, long nameIdentifier, UUID propertyGuid, byte[] propertyValue)
  • FolderInfo.changeMessages(MapiPropertyCollection updatedProperties) - changes all messages in folder
  • PersonalStorage.changeMessage(String entryId, MapiPropertyCollection updatedProperties) - change message properties
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
    // The path to the File directory.
    String dataDir = "data/" + "Sub.pst";

    try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir)) {
        FolderInfo testFolder = personalStorage.getRootFolder().getSubFolder("Inbox");

        // Create the collection of message properties for adding or updating
        MapiPropertyCollection newProperties = new MapiPropertyCollection();

        // Normal, Custom and PidLidLogFlags named property
        MapiProperty property = new MapiProperty(MapiPropertyTag.PR_ORG_EMAIL_ADDR_W, "test_address@org.com".getBytes(Charset.forName("utf-16le")));
        MapiProperty namedProperty1 = new MapiNamedProperty(generateNamedPropertyTag(0L, MapiPropertyType.PT_LONG), "ITEM_ID", UUID.randomUUID(),
                BitConverter.getBytesInt64(123));
        MapiProperty namedProperty2 = new MapiNamedProperty(generateNamedPropertyTag(1L, MapiPropertyType.PT_LONG), 0x0000870C,
                UUID.fromString("0006200A-0000-0000-C000-000000000046"), BitConverter.getBytesInt64(0));
        newProperties.add(namedProperty1.getTag(), namedProperty1);
        newProperties.add(namedProperty2.getTag(), namedProperty2);
        newProperties.add(property.getTag(), property);
        testFolder.changeMessages(testFolder.enumerateMessagesEntryId(), newProperties);
    }
}

private static long generateNamedPropertyTag(long index, int dataType) {
    return (((0x8000 | index) << 16) | (long) dataType) & 0x00000000FFFFFFFFL;
}

Ekstrak Lampiran tanpa Mengekstrak Pesan Lengkap

API Aspose.Email dapat digunakan untuk mengekstrak lampiran dari pesan PST tanpa mengekstrak seluruh pesan terlebih dahulu. ExtractAttachments metode dari PersonalStorage dapat digunakan untuk melakukan hal ini. Potongan kode berikut menunjukkan cara mengekstrak lampiran tanpa mengekstrak seluruh pesan.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";

try (PersonalStorage personalstorage = PersonalStorage.fromFile(dataDir + "Outlook.pst")) {
    FolderInfo folder = personalstorage.getRootFolder().getSubFolder("Inbox");

    for (String messageInfo : folder.enumerateMessagesEntryId()) {
        MapiAttachmentCollection attachments = personalstorage.extractAttachments(messageInfo);

        if (attachments.size() != 0) {
            for (MapiAttachment attachment : attachments) {
                if (attachment.getLongFileName() != null && !attachment.getLongFileName().isEmpty()) {
                    if (attachment.getLongFileName().contains(".msg")) {
                        continue;
                    } else {
                        attachment.save(dataDir + "Attachments/" + attachment.getLongFileName());
                    }
                }
            }
        }
    }
}

Menambahkan File ke PST

Fungsi utama Microsoft Outlook adalah mengelola email, kalender, tugas, kontak, dan entri jurnal. Selain itu, file juga dapat ditambahkan ke folder PST dan PST yang dihasilkan akan mencatat dokumen yang ditambahkan. Aspose.Email menyediakan fasilitas untuk menambahkan file ke folder dengan cara yang sama selain menambahkan pesan, kontak, tugas, dan entri jurnal ke PST. Potongan kode berikut menunjukkan cara menambahkan dokumen ke folder PST menggunakan Aspose.Email.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";

try (PersonalStorage personalStorage = PersonalStorage.create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode)) {
    FolderInfo folder = personalStorage.getRootFolder().addSubFolder("Files");

    // Add Document.doc file with the "IPM.Document" message class by default.
    folder.addFile(dataDir + "attachment_1.doc", null);
}