PST ファイルでのメッセージ操作

PST ファイルへのメッセージの追加

新しい PST ファイルを作成し、サブフォルダーを追加する PST ファイルの作成方法とサブフォルダーの追加方法を示しました。Aspose.Email を使用すると、作成またはロードした PST ファイルのサブフォルダーにメッセージを追加できます。この記事では、ディスクから PST の Inbox サブフォルダーに 2 つのメッセージを追加します。次のものを使用してください PersonalStorage および FolderInfo PST ファイルにメッセージを追加するクラスです。PST ファイルの Inbox フォルダーにメッセージを追加するには:

  1. FolderInfo クラスのインスタンスを作成し、Inbox フォルダーの内容でロードします。
  2. ディスクからInboxフォルダーへメッセージを追加するには、次のメソッドを呼び出します FolderInfo.addMessage() メソッド。 FolderInfo クラスは以下を公開します addMessages このメソッドは、フォルダーに大量のメッセージを追加でき、ディスクへの I/O 操作を削減し、パフォーマンスを向上させます。完全な例は以下にあります。 バルクメッセージの追加.

以下のコードスニペットは、Inbox という PST のサブフォルダーにメッセージを追加する方法を示します。

// 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 Implementation の作成方法を示します。

// 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 からストリームへメッセージを直接保存する

メッセージの MsgInfo を抽出せずに、PST ファイルから直接ストリームへメッセージを保存するには、次を使用します: 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);
        }
    }
}

PST ファイルから n 件のメッセージを抽出する

以下のコードスニペットは、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 ファイルの Sent サブフォルダーからメッセージを削除するには:

  1. インスタンスを作成します FolderInfo クラスを使用し、Sent サブフォルダーの内容でロードします。
  2. 以下を呼び出して Sent フォルダーからメッセージを削除します。 FolderInfo.deleteChildItem() メソッドとパラメーターを渡す MessageInfo.EntryId パラメーターとして使用します。以下のコードスニペットは、PST ファイルの Sent サブフォルダーからメッセージを削除する方法を示しています。
// 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 ファイルからアイテムを一括削除する

Aspose.Email API は、PST ファイルからアイテムを一括削除するために使用できます。これは以下を使用して実現します: deleteChildItems() 削除対象のアイテムを指すエントリ 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 for 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 内の特定レコードを検索できます。送信者、受信者、件名、メッセージの重要度、添付ファイルの有無、メッセージサイズ、さらにはメッセージ ID などの検索パラメーターで PST のメッセージを検索できます。 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 ファイル内のメッセージのプロパティを一括で更新する方法を示します。以下のコードスニペットは、複数のメッセージに対して一括でプロパティを更新する方法を示します。

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

メッセージ全体を抽出せずに添付ファイルを抽出

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 は、メッセージ、連絡先、タスク、ジャーナルエントリに加えて、ファイルをフォルダーに追加する機能も提供します。以下のコードスニペットは、Aspose.Email を使用して 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 + "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);
}