Работа със съобщения в PST файл

Contents
[ ]

Добавяне на съобщения към PST файлове

Създайте нов PST файл и добавете подпапки показахме как да създадем PST файл и да добавим подпапка към него. С Aspose.Email можете да добавяте съобщения към подпапки на PST файл, който сте създали или заредили. Тази статия добавя две съобщения от диска към подпапката Inbox на PST. Използвайте PersonalStorage и FolderInfo класове за добавяне на съобщения към PST файлове. За да добавите съобщения към папка Inbox в PST файл:

  1. Създайте екземпляр на класа FolderInfo и го заредете със съдържанието на папката Inbox.
  2. Добавете съобщения от диска към папката Inbox, извиквайки FolderInfo.addMessage() метод. The FolderInfo класът излага addMessages метод, който позволява да се добави голям брой съобщения към папката, намалявайки I/O операциите към диска и подобрявайки производителността. Пълен пример може да бъде намерен по-долу, в Масово добавяне на съобщения.

Кодовият фрагмент по-долу показва как да добавите съобщения към подпапка в PST, наречена 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"));

Масово добавяне на съобщения

Добавянето на отделни съобщения към PST води до повече I/O операции към диска и следователно може да забави производителността. За подобрена производителност съобщенията могат да се добавят към PST в режим на масово добавяне, за да се минимизират I/O операциите. addMessages(Iterable messages) методът позволява да дефинирате диапазон от съобщения, които да бъдат добавени към PST за подобрена производителност и може да се използва в следните сценарии. Освен това, събитие MessageAdded се задейства, когато съобщение е добавено към папката.

Зареждане на съобщения от диск

Следният кодов фрагмент показва как да заредите съобщения от диск.

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

Имплементация на Iterable

Следният кодов фрагмент показва как да създадете имплементация на 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());
    }
}

Добавяне на съобщения от друг PST

За добавяне на съобщения от друг PST, използвайте FolderInfo.enumerateMapiMessages() метод, който връща Iterable. Следният кодов откъс показва как да добавите съобщения от друг PST.

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

Получаване на информация за съобщения от Outlook PST файл

В Прочетете Outlook PST файл и получете информация за папки и подпапки, обсъдихме зареждането на Outlook PST файл и обхождането на неговите папки за получаване на имената им и броя на съобщенията в тях. Тази статия обяснява как да се прочетат всички папки и подпапки в PST файла и да се покаже информацията за съобщенията, например, тема, подател и получатели. FolderInfo.getContents() метод се използва за показване кратка информация за съобщението като тема, подател, получатели. По отношение на производителността, това е най-подходящата опция за получаване на основна информация за съобщенията. За да извлича пълни данни за съобщението, PersonalStorage.extractMessage() предоставя метод. Outlook PST файлът може да съдържа вложени папки. За получаване на информация за съобщенията от тях, както и от папките от най-високо ниво, използвайте рекурсивен метод за четене на всички папки. Следният кодов откъс показва как да прочетете Outlook 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 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);
        }
    }
}

Извличане на съобщения от PST файлове

Тази статия показва как да се четат Microsoft Outlook PST файлове и извлечете съобщения. Съобщенията се запазват на диск във формат MSG. Статията също показва как да извлечете конкретен брой съобщения от PST файл. Използвайте рекурсивен метод за обхождане на всички папки (включително вложени) и извикайте PersonalStorage.extractMessage() метод за получаване на Outlook съобщения в пример на MapiMessage клас. След това извикайте MapiMessage.save() метод за запазване на съобщението на диск или в поток във формат MSG. Следният кодов откъс показва как да извлечете съобщения от 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);
        }
    }
}

Записване на съобщения директно от PST към поток

За да запишете съобщения от PST файл директно към поток, без да извличате MsgInfo за съобщенията, използвайте saveMessageToStream() метод. Следният кодов откъс показва как да запишете съобщения директно от 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/";

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

Извличане на n брой съобщения от PST файл

Следният кодов откъс показва как да извлечете определен брой съобщения от PST. Просто задайте индекса на първото съобщение и общия брой съобщения, които да бъдат извлечени.

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

Получаване на общия брой елементи от PST файл

Aspose.Email предоставя GetTotalItemsCount() метод на PersonalStorage.Store свойство. То връща общия брой съобщения, съдържащи се в PST.

Следният примерен код показва как да извлечете общия брой елементи (съобщения, срещи, контакти и т.н.), съхранени в PST файла:

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

Изтриване на елементи от PST файлове

Add Messages to PST Files показва как да се добавят съобщения към PST файлове. Разбира се, възможно е също така да се изтриват елементи (съдържание) от PST файл и може да бъде желателно масово изтриване на съобщения. Елементи от PST файл могат да се изтриват чрез FolderInfo.deleteChildItem() метод. API също предоставя FolderInfo.deleteChildItems() метод за масово изтриване на елементи от PST файл.

Изтриване на съобщения от PST файлове

Тази статия показва как да се използва FolderInfo клас за достъп до конкретни папки в PST файл. За изтриване на съобщения от подпапката „Изпратени“ на предварително зареден или създаден PST файл:

  1. Създайте инстанция на FolderInfo клас и го заредете със съдържанието на подпапката „Изпратени“.
  2. Изтрийте съобщения от папка „Изпратени“ като извикате FolderInfo.deleteChildItem() метод и предаване на MessageInfo.EntryId като параметър. Следният кодов откъс показва как да изтриете съобщения от подпапка „Изпратени“ на 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");
    }
}

Изтриване на папки от PST файлове

Можете да изтриете PST папка, като я преместите в папката „Изтрито“.

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

Предимството на този метод е, че изтритата папка може лесно да бъде възстановена.

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

Можете също така да премахнете трайно папка от папката „Изтрито“, ако е необходимо.

deletedItemsFolder.deleteChildItem(emptyFolder.getEntryId());

Този deleteChildItem() методът може да се използва за всяка папка, ако искате незабавно и трайно да изтриете подпапка, заобикаляйки папката „Изтрито“.

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

Масово изтриване на елементи от PST файл

API‑то на Aspose.Email може да се използва за масово изтриване на елементи от PST файл. Това се постига чрез използване на deleteChildItems() метод, който приема списък от елементи Entry ID, отнасящи се до елементите, които да бъдат изтрити. Следният кодов откъс показва как да изтриете елементи масово от 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);
}

Изброяване и възстановяване на меко изтрити съобщения от PST

Възможно е да се извлекат трайно изтрити съобщения с Aspose.Email за Java. Неговият API позволява изброяване на меко изтрити съобщения в PST файлове. Мекото изтриване се отнася за съобщения, които са изтрити два пъти – първо преместени в папка „Изтрито“, а после премахнати от там. Тези съобщения все още са възстановими и Aspose.Email предоставя удобен начин за достъп до тях. PersonalStorage.findAndEnumerateSoftDeletedItems() методът връща колекция от RestoredItemEntry обекти. Всеки запис съдържа:

  • MapiMessage item — възстановеното съобщение.
  • String FolderId - идентификаторът на папката, към която оригинално принадлежеше съобщението.

Следният примерен код демонстрира как да изброите меко изтритите (възстановими) имейл елементи в 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("-----------------------------------");
    }
}

Търсене на съобщения и папки в PST по критерий

Файловете за лично съхранение (PST) могат да съдържат огромно количество данни и търсенето на данни, отговарящи на конкретен критерий в такива големи файлове, изисква включване на множество проверочни точки в кода за филтриране на информацията. С PersonalStorageQueryBuilder клас, Aspose.Email позволява търсене на конкретни записи в PST въз основа на зададен критерий за търсене. PST може да се търси за съобщения според параметри като подател, получател, тема, важност на съобщението, наличие на прикачени файлове, размер на съобщението и дори ID на съобщението. PersonalStorageQueryBuilder може също да се използва за търсене на подпапки.

Търсене на съобщения и папки в PST

Следният кодов откъс показва как да използвате PersonalStorageQueryBuilder клас за търсене на съдържание в PST въз основа на различни критерии за търсене. Например, показва търсене в 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/";

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

Търсене на низ в PST с параметър за игнориране на регистъра

Следният кодов откъс показва как да търсите низ в 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/";

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

Търсене на теми на съобщения по няколко ключови думи в PST файл

Можете да използвате MailQueryBuilder.or метод за намиране на съобщения със заглавие, съдържащо поне една от зададените думи, както е показано по-долу:

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

Страницирано извличане на съдържанието на PST папка

Подобрете производителността на приложението си и контрола при навигация в големи папки. Извличайте съдържанието на папките по страници, използвайки претоварването на Aspose.Email на getContents метод. Този метод - FolderInfo.getContents(MailQuery query, int startIndex, int count) - извлича подмножество от съобщения, които отговарят на зададената заявка, започвайки от определен индекс и ограничени с брой. Следният примерен код демонстрира страницирано извличане и обработка на филтрирани съобщения от 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());
        }
    }
}

Преместване на елементи в други папки на PST файл

Aspose.Email позволява преместване на елементи от изходна папка към друга папка в същия файл за лично съхранение (PST). Това включва:

  • Преместване на посочена папка към нова родителска папка.
  • Преместване на посочено съобщение към нова папка.
  • Преместване на съдържанието към нова папка.
  • Преместване на подпапки към нова родителска папка.

Следният кодов откъс показва как да преместите елементи като съобщения и папки от изходна папка към друга папка в същия PST файл.

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

Актуализиране на свойства на съобщения в PST файл

Понякога е необходимо да се актуализират определени свойства на съобщения, като промяна на темата, маркиране на важността и др. Актуализирането на съобщение в PST файл с такива промени в свойствата може да се постигне чрез FolderInfo.changeMessages метод. Тази статия показва как да актуализирате съобщения в масов режим в PST файл за промени в свойствата. Следният кодов отрязък показва как да актуализирате свойства на съобщения в масов режим за множество съобщения в 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);

Актуализиране на потребителски свойства в PST файл

Понякога е необходимо да се маркират елементи, обработени в PST файла. Aspose.Email API позволява това чрез MapiProperty и MapiNamedProperty. Следващите методи са полезни за постигане на това.

  • constructor MapiNamedProperty(long propertyTag, String nameIdentifier, UUID propertyGuid, byte[] propertyValue)
  • constructor MapiNamedProperty(long propertyTag, long nameIdentifier, UUID propertyGuid, byte[] propertyValue)
  • FolderInfo.changeMessages(MapiPropertyCollection updatedProperties) - променя всички съобщения в папката
  • PersonalStorage.changeMessage(String entryId, MapiPropertyCollection updatedProperties) - променя свойства на съобщението
// 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;
}

Извличане на прикрепени файлове без извличане на цялото съобщение

Aspose.Email API може да се използва за извличане на прикрепени файлове от PST съобщения, без първо да се извлича цялото съобщение. ExtractAttachments метод на PersonalStorage може да се използва за това. Следният кодов отрязък показва как да извлечете прикрепени файлове, без да извличате цялото съобщение.

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

Добавяне на файлове към PST

Ключовата функционалност на Microsoft Outlook е управлението на имейли, календари, задачи, контакти и журнални записи. Освен това, файлове също могат да се добавят към папка в PST и полученият PST запазва запис за добавените документи. Aspose.Email предлага възможност за добавяне на файлове към папка по същия начин, както и добавяне на съобщения, контакти, задачи и журнални записи към PST. Следният кодов отрязък показва как да добавите документи към папка в PST, използвайки 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);
}