新規 PST の作成、サブフォルダーとメッセージの追加
既存の PST ファイルの解析に加えて、Aspose.Email はゼロから PST ファイルを作成する機能を提供します。本記事では Outlook PST ファイルの作成方法とサブフォルダーの追加方法を示します。
使用する PersonalStorage クラスを使用して、ローカルディスク上の任意の場所に PST ファイルを作成します。最初から PST ファイルを作成するには:
- 次を使用して PST を作成します PersonalStorage.create() メソッド。
- Root フォルダーにアクセスし、次に呼び出すことで、PST ファイルのルートにサブフォルダーを追加します: addSubFolder() メソッド。
以下のコード スニペットは、PST ファイルを作成し、Inbox というサブフォルダーを追加する方法を示しています。
// Create new PST
try (PersonalStorage pst = PersonalStorage.create(path, FileFormatVersion.Unicode)) {
// Add new folder "Test"
pst.getRootFolder().addSubFolder("Inbox");
}
OutputStream を使用して 2GB 超の PST を作成
Aspose.Email ユーザーは、PersonalStorage コンストラクターを使用して PST の内部キャッシュを最適化できます:
- blockSize - キャッシュバッファを拡張する最適なブロックサイズ(バイト単位)。
PersonalStorage create(OutputStream stream, int blockSize, /*FileFormatVersion*/int version)
メッセージ サイズと作成された PST ファイルのサイズを削減
Aspose.Email は本文コンテンツを圧縮する機能を提供しており、メッセージサイズの削減に役立ちます。大きなメッセージを送信する場合や、帯域幅やストレージが制限されている場合に特に有用です。この目的のため、ライブラリは次のメソッドに圧縮パラメータを提供しています:
- MapiMessageItemBase.setBodyContent(String content, /BodyContentType/int contentType, boolean compression) - 本文の内容を設定します。
- MapiMessageItemBase.setBodyRtf(String content, boolean compression) - RTF 形式のメッセージテキストを取得または設定します。
以下のコード スニペットは、MAPI メッセージ本文を設定する際に RTF 圧縮を使用する方法を示しています:
MapiMessage msg = new MapiMessage("from@doamin.com", "to@domain.com", "subject", "body");
// set the html body and keep it compressed
// this will reduce the message size
msg.setBodyContent(htmlBody, BodyContentType.Html, true);
SeekableByteChannel ストリームに基づく PersonalStorage の作成
Aspose.Email for Java を使用すると、java.nio.channels を利用して Personal Storage(PST)ファイルを操作できます。SeekableByteChannel ストリームを使用して PersonalStorage インスタンスを作成できます。以下のコード スニペットは、FileChannel ストリームに基づく PersonalStorage インスタンスの作成方法、ルート フォルダーに "messageFolder" というサブフォルダーを追加する方法、および "messageFolder" ディレクトリ内のファイルからメッセージをインポートする方法を示しています:
try (RandomAccessFile raf = new RandomAccessFile("test.pst", "rw")) {
FileChannel channel = raf.getChannel();
try (PersonalStorage pst = PersonalStorage.create(channel, FileFormatVersion.Unicode)) {
FolderInfo messageFolder = pst.getRootFolder().addSubFolder("messageFolder");
for (File f : new File("messageFolder").listFiles()) {
messageFolder.addMessage(MapiMessage.load(f.getAbsolutePath()));
}
}
}
フォルダー コンテナ クラスの変更
フォルダー クラスを変更する必要があることがあります。一般的な例は、異なる種類(予定、メッセージなど)のメッセージが同じフォルダーに追加される場合です。このような場合、フォルダー内のすべての要素が正しく表示されるようにフォルダー クラスを変更する必要があります。以下のコード スニペットは、この目的で PST のフォルダー コンテナ クラスを変更する方法を示しています。
try (PersonalStorage pst = PersonalStorage.fromFile("PersonalStorage1.pst")) {
FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");
folder.changeContainerClass("IPF.Note");
}
パフォーマンス向上のための一括メッセージ追加
個別にメッセージを PST に追加すると、ディスクへの I/O が増えてパフォーマンスが低下する可能性があります。パフォーマンス向上のため、メッセージは一括モードで PST に追加し、I/O を最小化できます。 addMessages(Iterable
別の PST からメッセージを追加
別の PST からメッセージを追加するには、次を使用します: FolderInfo.enumerateMapiMessages() 返すメソッドは Iterable<MapiMessage>:
try (PersonalStorage srcPst = PersonalStorage.fromFile("source.pst", false)) {
try (PersonalStorage destPst = PersonalStorage.fromFile("destination.pst")) {
// Get the folder by name
FolderInfo srcFolder = srcPst.getRootFolder().getSubFolder("SomeFolder");
FolderInfo destFolder = destPst.getRootFolder().getSubFolder("SomeFolder");
destFolder.MessageAdded.add(new MessageAddedEventHandler() {
// Handles the MessageAdded event.
public void invoke(Object sender, MessageAddedEventArgs e) {
System.out.println("Added: " + e.getEntryId());
}
});
destFolder.addMessages(srcFolder.enumerateMapiMessages());
}
}
ディレクトリからメッセージを追加
ディレクトリからメッセージを追加するには、次を作成します: getMessages(String pathToDir) 返すメソッドは Iterable<MapiMessage>:
// Read messages from directory.
static Iterable<MapiMessage> getMessages (String pathToDir)
{
return Arrays.stream(listDirectory(pathToDir, "*.msg"))
.map(MapiMessage::load).collect(Collectors.toList());
}
try ( PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
FolderInfo folder = pst.getRootFolder().getSubFolder("SomeFolder");
folder.MessageAdded.add(new MessageAddedEventHandler() {
// Handles the MessageAdded event.
public void invoke(Object sender, MessageAddedEventArgs e) {
System.out.println("Added: " + e.getEntryId());
}
});
folder.addMessages(getMessages("MessageDirectory"));
}