新規 PST の作成、サブフォルダーとメッセージの追加

既存の PST ファイルの解析に加えて、Aspose.Email はゼロから PST ファイルを作成する機能を提供します。本記事では Outlook PST ファイルの作成方法とサブフォルダーの追加方法を示します。

  1. 新しい PST ファイルの作成.
  2. フォルダーのコンテナ クラスの変更.
  3. パフォーマンス向上のための一括メッセージ追加

使用する PersonalStorage クラスを使用して、ローカルディスク上の任意の場所に PST ファイルを作成します。最初から PST ファイルを作成するには:

  1. 次を使用して PST を作成します PersonalStorage.create() メソッド。
  2. 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 は本文コンテンツを圧縮する機能を提供しており、メッセージサイズの削減に役立ちます。大きなメッセージを送信する場合や、帯域幅やストレージが制限されている場合に特に有用です。この目的のため、ライブラリは次のメソッドに圧縮パラメータを提供しています:

以下のコード スニペットは、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 messages) このメソッドはメッセージを一括で追加でき、次のシナリオで使用できます。また、 MessageAdded フォルダーにメッセージが追加されたときに発生するイベントです。

別の 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"));
}