Práce se zprávami v souboru PST

Přidávání zpráv do souborů PST

Vytvořte nový soubor PST a přidejte podadresáře ukázal, jak vytvořit soubor PST a přidat do něj podadresář. S Aspose.Email můžete přidávat zprávy do podadresářů souboru PST, který jste vytvořili nebo načetli. Tento článek přidává dvě zprávy z disku do podadresáře Inbox v PST. Použijte PersonalStorage a FolderInfo třídy pro přidávání zpráv do souborů PST. Pro přidání zpráv do složky Inbox souboru PST:

  1. Vytvořte instanci třídy FolderInfo a načtěte do ní obsah složky Inbox.
  2. Přidejte zprávy z disku do složky Inbox voláním FolderInfo.addMessage() metoda. FolderInfo třída vystavuje addMessages metoda, která umožňuje přidat velké množství zpráv do složky, čímž snižuje operace I/O na disk a zlepšuje výkon. Kompletní příklad je uveden níže v Hromadné přidávání zpráv.

Níže uvedené úryvky kódu ukazují, jak přidat zprávy do podadresáře PST nazvaného 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"));

Hromadné přidávání zpráv

Přidávání jednotlivých zpráv do PST implikuje více I/O operací na disk a může tak zpomalit výkon. Pro lepší výkon lze zprávy přidávat do PST hromadně, aby se minimalizovaly I/O operace. The addMessages(Iterable messages) metoda vám umožňuje definovat rozsah zpráv, které mají být přidány do PST pro zvýšení výkonu, a může být použita v následujících scénářích. Navíc se událost MessageAdded spustí, když je zpráva přidána do složky.

Načítání zpráv z disku

Následující úryvek kódu ukazuje, jak načíst zprávy z disku.

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

Implementace Iterable

Následující úryvek kódu vám ukazuje, jak vytvořit implementaci 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());
    }
}

Přidávání zpráv z jiného PST

Pro přidání zpráv z jiného PST použijte FolderInfo.enumerateMapiMessages() metoda, která vrací Iterable. Níže uvedený úryvek kódu ukazuje, jak přidat zprávy z jiného 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());
}

Získání informací o zprávách z Outlook PST souboru

V Načtení souboru Outlook PST a získání informací o složkách a podsložkách, diskutovali jsme o načtení souboru Outlook PST a procházení jeho složek za účelem získání názvů složek a počtu zpráv v nich. Tento článek vysvětluje, jak číst všechny složky a podadresáře v souboru PST a zobrazit informace o zprávách, např. předmět, odesílatele a příjemce. FolderInfo.getContents() metoda se používá k zobrazení stručné informace o zprávě jako předmět, odesílatel, příjemci. Co se týče výkonu, je to nejvhodnější možnost pro získání základních informací o zprávách. Pro extrahovat úplná data zprávy, PersonalStorage.extractMessage() je poskytnuta metoda. Soubor Outlook PST může obsahovat vnořené složky. Pro získání informací o zprávách z nich i z hlavních složek použijte rekurzivní metodu pro čtení všech složek. Níže uvedený úryvek kódu ukazuje, jak načíst soubor Outlook PST a rekurzivně zobrazit obsah složek a zpráv.

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

Extrahování zpráv ze souborů PST

Tento článek ukazuje, jak číst soubory Microsoft Outlook PST a extrahovat zprávy. Zprávy jsou pak uloženy na disk ve formátu MSG. Článek také ukazuje, jak extrahovat konkrétní počet zpráv ze souboru PST. Použijte rekurzivní metodu k procházení všech složek (včetně vnořených) a zavolejte PersonalStorage.extractMessage() metodu pro získání Outlook zpráv do instance MapiMessage třída. Poté zavolejte MapiMessage.save() metoda pro uložení zprávy buď na disk, nebo do proudu ve formátu MSG. Níže uvedený úryvek kódu ukazuje, jak extrahovat zprávy ze souboru 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);
        }
    }
}

Ukládání zpráv přímo z PST do proudu

Pro uložení zpráv ze souboru PST přímo do proudu, bez extrakce MsgInfo pro zprávy, použijte saveMessageToStream() metoda. Níže uvedený úryvek kódu ukazuje, jak uložit zprávy přímo z PST do proudu.

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

Extrahování n počtu zpráv ze souboru PST

Níže uvedený úryvek kódu ukazuje, jak extrahovat daný počet zpráv ze souboru PST. Stačí zadat index první zprávy a celkový počet zpráv, které mají být extrahovány.

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

Získání celkového počtu položek ze souboru PST

Aspose.Email poskytuje GetTotalItemsCount() metoda třídy PersonalStorage.Store vlastnost. Vrací celkový počet zpráv obsažených v PST.

Níže uvedený ukázkový kód ukazuje, jak získat celkový počet položek (zpráv, schůzek, kontaktů atd.) uložených v souboru PST:

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

Mazání položek ze souborů PST

Add Messages to PST Files ukázalo, jak přidávat zprávy do souborů PST. Samozřejmě je také možné mazat položky (obsah) ze souboru PST a může být žádoucí mazat zprávy hromadně. Položky ze souboru PST lze smazat pomocí FolderInfo.deleteChildItem() metoda. API také poskytuje FolderInfo.deleteChildItems() metoda pro hromadné mazání položek ze souboru PST.

Mazání zpráv ze souborů PST

Tento článek ukazuje, jak použít FolderInfo třída pro přístup k určitým složkám v souboru PST. Pro smazání zpráv z podadresáře Odeslané v dříve načteném nebo vytvořeném souboru PST:

  1. Vytvořte instanci FolderInfo třídy a načíst ji s obsahem podadresáře Odeslané.
  2. Smazat zprávy ze složky Odeslané voláním FolderInfo.deleteChildItem() metoda a předání MessageInfo.EntryId jako parametr. Níže uvedený úryvek kódu ukazuje, jak smazat zprávy z podadresáře Odeslané v souboru 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");
    }
}

Mazání složek ze souborů PST

Složku PST můžete smazat její přesunem do složky Smazané položky.

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

Výhodou této metody je, že smazaná složka může být snadno obnovena.

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

V případě potřeby můžete také trvale odstranit složku ze složky Smazané položky.

deletedItemsFolder.deleteChildItem(emptyFolder.getEntryId());

The deleteChildItem() metoda může být použita pro jakékoli složky, pokud chcete okamžitě a trvale smazat podadresář, obcházejíc složku Smazané položky.

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

Hromadné mazání položek ze souboru PST

API Aspose.Email lze použít k hromadnému mazání položek ze souboru PST. To je realizováno pomocí deleteChildItems() metoda, která přijímá seznam položek Entry ID odkazujících na položky k odstranění. Níže uvedený úryvek kódu ukazuje, jak hromadně mazat položky v souboru 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);
}

Vyjmenování a obnovení soft‑smazaných zpráv z PST

Je možné získat trvale smazané zprávy pomocí Aspose.Email pro Javu. Jeho API umožňuje vyjmenovat soft‑smazané zprávy v souborech PST. Soft‑smazané položky jsou zprávy, které byly smazány dvakrát – nejprve přesunuty do složky Smazané položky a poté odtud odstraněny. Tyto zprávy jsou stále obnovitelné a Aspose.Email poskytuje pohodlný způsob, jak k nim přistupovat. PersonalStorage.findAndEnumerateSoftDeletedItems() metoda vrací kolekci RestoredItemEntry objekty. Každý záznam obsahuje:

  • MapiMessage item — obnovená zpráva.
  • String FolderId - identifikátor složky, do které zpráva původně patřila.

Níže uvedený ukázkový kód demonstruje, jak vyjmenovat soft‑smazané (obnovitelné) e‑mailové položky v souborech 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("-----------------------------------");
    }
}

Vyhledávání zpráv a složek v PST podle kritéria

Soubory Personal Storage (PST) mohou obsahovat obrovské množství dat a vyhledávání dat, která splňují konkrétní kritéria v tak velkých souborech, vyžaduje zahrnutí více kontrolních bodů v kódu pro filtrování informací. S PersonalStorageQueryBuilder třída, Aspose.Email umožňuje vyhledávat konkrétní záznamy v PST na základě určených kritérií vyhledávání. PST lze prohledávat zprávy podle parametrů jako odesílatel, příjemce, předmět, důležitost zprávy, přítomnost příloh, velikost zprávy a dokonce ID zprávy. PersonalStorageQueryBuilder může být také použito k vyhledávání podadresářů.

Vyhledávání zpráv a složek v PST

Níže uvedený úryvek kódu ukazuje, jak použít PersonalStorageQueryBuilder třída pro vyhledávání obsahu v PST na základě různých kritérií vyhledávání. Například ukazuje vyhledávání PST podle:

  • Důležitost zprávy.
  • Třída zprávy.
  • Přítomnost příloh.
  • Velikost zprávy.
  • Datum zprávy.
  • Nepřečtené zprávy.
  • nepřečtené zprávy s přílohami a
  • složky s konkrétním názvem podadresáře.
// 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());
}

Vyhledávání řetězce v PST s parametrem ignorování velikosti písmen

Níže uvedený úryvek kódu ukazuje, jak vyhledat řetězec v PST s parametrem ignorování velikosti písmen.

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

Vyhledávání předmětů zpráv pomocí více klíčových slov v souboru PST

Můžete použít MailQueryBuilder.or metoda pro vyhledání zpráv s předmětem obsahujícím alespoň jedno ze zadaných slov, jak je uvedeno níže:

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

Stránkované načítání obsahu složky PST

Zlepšete výkon své aplikace a kontrolu při procházení velkých složek. Načtěte obsah složky stránkovaným způsobem pomocí přetížení metody Aspose.Email getContents metoda. Tato metoda - FolderInfo.getContents(MailQuery query, int startIndex, int count) - získá podmnožinu zpráv odpovídajících zadanému dotazu, počínaje daným indexem a omezenou počtem. Níže uvedený ukázkový kód demonstruje stránkované načítání a zpracování filtrovaných zpráv ze složky 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());
        }
    }
}

Přesun položek do jiných složek souboru PST

Aspose.Email umožňuje přesunout položky ze zdrojové složky do jiné složky ve stejném souboru Personal Storage (PST). To zahrnuje:

  • Přesun konkrétní složky do nové nadřazené složky.
  • Přesun konkrétní zprávy do nové složky.
  • Přesun obsahu do nové složky.
  • Přesun podadresářů do nové nadřazené složky.

Níže uvedený úryvek kódu ukazuje, jak přesunout položky, jako jsou zprávy a složky, ze zdrojové složky do jiné složky ve stejném souboru 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);
}

Aktualizace vlastností zpráv v souboru PST

Někdy je potřeba aktualizovat určité vlastnosti zpráv, jako změna předmětu, označení důležitosti zprávy a podobně. Aktualizace zprávy v PST souboru s takovými změnami ve vlastnostech zprávy může být provedena pomocí FolderInfo.changeMessages metoda. Tento článek ukazuje, jak hromadně aktualizovat zprávy v souboru PST kvůli změnám vlastností. Následující úryvek kódu ukazuje, jak aktualizovat vlastnosti zpráv v hromadném režimu pro více zpráv v souboru 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);

Aktualizace vlastních vlastností v souboru PST

Někdy je potřeba označit položky, které jsou v souboru PST zpracovány. API Aspose.Email umožňuje dosáhnout toho pomocí MapiProperty a MapiNamedProperty. Následující metody jsou při tom užitečné.

  • constructor MapiNamedProperty(long propertyTag, String nameIdentifier, UUID propertyGuid, byte[] propertyValue)
  • constructor MapiNamedProperty(long propertyTag, long nameIdentifier, UUID propertyGuid, byte[] propertyValue)
  • FolderInfo.changeMessages(MapiPropertyCollection updatedProperties) - mění všechny zprávy ve složce
  • PersonalStorage.changeMessage(String entryId, MapiPropertyCollection updatedProperties) - změnit vlastnosti zprávy
// 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;
}

Extrahovat přílohy bez extrakce celé zprávy

API Aspose.Email lze použít k extrakci příloh ze zpráv PST, aniž by nejprve byla extrahována celá zpráva. ExtractAttachments metoda PersonalStorage může být použito k tomuto účelu. Následující úryvek kódu ukazuje, jak extrahovat přílohy bez extrakce celé zprávy.

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

Přidávání souborů do PST

Klíčová funkčnost Microsoft Outlook zahrnuje správu e‑mailů, kalendářů, úkolů, kontaktů a deníkových záznamů. Navíc lze do složky PST přidávat soubory a výsledný PST uchovává záznamy o přidaných dokumentech. Aspose.Email poskytuje možnost přidávat soubory do složky stejným způsobem, jako přidávání zpráv, kontaktů, úkolů a deníkových záznamů do PST. Následující úryvek kódu ukazuje, jak přidat dokumenty do složky PST pomocí 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);
}