PST ファイルでのメッセージ操作
PST ファイルへのメッセージの追加
新しい PST ファイルを作成し、サブフォルダーを追加する PST ファイルの作成方法とサブフォルダーの追加方法を示しました。Aspose.Email を使用すると、作成またはロードした PST ファイルのサブフォルダーにメッセージを追加できます。この記事では、ディスクから PST の Inbox サブフォルダーに 2 つのメッセージを追加します。次のものを使用してください PersonalStorage および FolderInfo PST ファイルにメッセージを追加するクラスです。PST ファイルの Inbox フォルダーにメッセージを追加するには:
- FolderInfo クラスのインスタンスを作成し、Inbox フォルダーの内容でロードします。
- ディスクから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
ディスクからメッセージを読み込む
以下のコードスニペットは、ディスクからメッセージを読み込む方法を示します。
// 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
// 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 サブフォルダーからメッセージを削除するには:
- インスタンスを作成します FolderInfo クラスを使用し、Sent サブフォルダーの内容でロードします。
- 以下を呼び出して 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);
}