PST ファイルの作成と管理

既存の PST ファイルを解析するだけでなく、Aspose.Email はゼロから PST ファイルを作成する手段も提供します。この記事では、Outlook PST ファイルを作成し、サブフォルダーやメッセージを追加する方法を示します。

PST ファイルの作成

ローカル ディスクに新しい PST ファイルを作成するには、次のものを使用する必要があります: PersonalStorage class. このクラスを使用すると、.NET アプリケーションで PST ファイルを作成、読み取り、操作できます。1 行のコードでストレージ ファイルをゼロから作成します:

// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);

PST にサブフォルダーを追加

Root フォルダーにアクセスし、次に呼び出すことで、PST ファイルのルートにサブフォルダーを追加します: AddSubFolder メソッド。

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

// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");

フォルダー コンテナ クラスの確認

新しいフォルダーを作成したり既存のフォルダーにアイテムを追加したりする場合、新しいアイテムまたはフォルダーのコンテナ クラスが親フォルダーのコンテナ クラスと一致していることを確認し、PST ストレージ ファイル内の組織階層を維持することが重要です。この目的のために、Aspose.Email には EnforceContainerClassMatching プロパティ( FolderCreationOptions class. このプロパティは、追加されるフォルダーのコンテナ クラスが親フォルダーのコンテナ クラスと一致するかどうかをチェックするかを強制するかを指定します。’true’ に設定すると、コンテナ クラスが一致しない場合に例外がスローされます。デフォルトは ‘false’ です。

以下のコードサンプルは、次の使用例を示しています: EnforceContainerClassMatching コンテナクラスが一致しないフォルダーを追加する際に例外をスローするかどうかを制御するプロパティ:

using (var pst = PersonalStorage.Create("storage.pst", FileFormatVersion.Unicode))
{
    // Create a standard Contacts folder with the IPF.Contacts container class.
    var contacts = pst.CreatePredefinedFolder("Contacts", StandardIpmFolder.Contacts);
    
    // An exception will not arise. EnforceContainerClassMatching is false by default.
    contacts.AddSubFolder("Subfolder1", "IPF.Note");
    
    // An exception will occur as the container class of the subfolder being added (IPF.Note) 
    // does not match the container class of the parent folder (IPF.Contact).
    contacts.AddSubFolder("Subfolder3", new FolderCreationOptions {EnforceContainerClassMatching = true, ContainerClass = "IPF.Note"});
}

注: PST のフォルダー作成時にコンテナクラスの一致を強制する際は、例外を適切に処理し、予期しない動作を防止してください。

フォルダーコンテナクラスの変更

フォルダーコンテナクラスを変更する必要がある場合があります。一般的な例として、異なる種類(予定、メッセージなど)のメッセージを同じフォルダーに追加するケースがあります。このような場合、フォルダー内のすべての要素が正しく表示されるようにフォルダークラスを変更する必要があります。以下のコードスニペットは、PST のフォルダーコンテナクラスを変更する方法を示しています。

using var pst = PersonalStorage.FromFile("PersonalStorage1.pst);
var folder = pst.RootFolder.GetSubFolder("Inbox");

folder.ChangeContainerClass("IPF.Note");

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-.NET
using (var personalStorage = PersonalStorage.Create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode))
{
    var folder = personalStorage.RootFolder.AddSubFolder("Files");

    // Add Document.doc file with the "IPM.Document" message class by default.
    folder.AddFile(dataDir + "attachment_1.doc", null);
}

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

Aspose.Email を使用すると、作成または読み込んだ PST ファイルのサブフォルダーにメッセージを追加できます。本記事では、ディスクから 2 件のメッセージを PST の Inbox サブフォルダーに追加します。次を使用してください: 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-.NET
// Create new PST            
var personalStorage = PersonalStorage.Create(dataDir, FileFormatVersion.Unicode);

// Add new folder "Inbox"
personalStorage.RootFolder.AddSubFolder("Inbox");

// Select the "Inbox" folder
var inboxFolder = personalStorage.RootFolder.GetSubFolder("Inbox");

// Add some messages to "Inbox" folder
inboxFolder.AddMessage(MapiMessage.FromFile(RunExamples.GetDataDir_Outlook() + "MapiMsgWithPoll.msg"));

パフォーマンス向上のための一括メッセージ追加

個別にメッセージを PST に追加すると、ディスクへの I/O 操作が増え、パフォーマンスが低下する可能性があります。パフォーマンス向上のため、バルクモードでメッセージを PST に追加して I/O 操作を最小限に抑えることができます。 AddMessages このメソッドはメッセージを一括で追加でき、次のシナリオで使用できます。また、 MessageAdded フォルダーにメッセージが追加されたときに発生するイベントです。

別の PST からメッセージを追加

別の PST からメッセージを追加するには、次を使用します: FolderInfo.EnumerateMapiMessages 返すメソッドは IEnumerable<MapiMessage>:

using var srcPst = PersonalStorage.FromFile(@"source.pst", false);
using var destPst = PersonalStorage.FromFile(@"destination.pst");

// Get the folder by name
var srcFolder = srcPst.RootFolder.GetSubFolder("SomeFolder");
var destFolder = destPst.RootFolder.GetSubFolder("SomeFolder");

destFolder.MessageAdded += new MessageAddedEventHandler(OnMessageAdded);
destFolder.AddMessages(srcFolder.EnumerateMapiMessages());


// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

ディレクトリからメッセージを追加

ディレクトリからメッセージを追加するには、次を作成します: GetMessages(string pathToDir) 名前付きイテレータメソッドで、次を返します IEnumerable<MapiMessage>:

using var pst = PersonalStorage.FromFile(@"storage.pst");
var folder = pst.RootFolder.GetSubFolder("SomeFolder");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(GetMessages(@"MessageDirectory"));

// Named iterator method to read messages from directory.
static IEnumerable<MapiMessage> GetMessages(string pathToDir)
{
    string[] files = Directory.GetFiles(pathToDir, "*.msg");

    foreach (var file in files)
    {
        yield return MapiMessage.Load(file);
    }
}

// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

ディスクからメッセージをロード

以下のコードスニペットは、ディスクからメッセージをロードする方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
private static void AddMessagesInBulkMode(string fileName, string msgFolderName)
{
    using (PersonalStorage personalStorage = PersonalStorage.FromFile(fileName))
    {
        FolderInfo folder = personalStorage.RootFolder.GetSubFolder("myInbox");
        folder.MessageAdded += OnMessageAdded;
        folder.AddMessages(new MapiMessageCollection(msgFolderName));
    }
}
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine(e.EntryId);
    Console.WriteLine(e.Message.Subject);
}

IEnumerable の実装

以下のコードスニペットは、IEnumerable の実装方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class MapiMessageCollection : IEnumerable<MapiMessage>
{
    private string path;

    public MapiMessageCollection(string path)
    {
        this.path = path;
    }

    public IEnumerator<MapiMessage> GetEnumerator()
    {
        return new MapiMessageEnumerator(path);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MapiMessageEnumerator : IEnumerator<MapiMessage>
{
    private readonly string[] files;

    private int position = -1;

    public MapiMessageEnumerator(string path)
    {
        string path1 = RunExamples.GetDataDir_Outlook();
        files = Directory.GetFiles(path1);
    }

    public bool MoveNext()
    {
        position++;
        return (position < files.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public MapiMessage Current
    {
        get
        {
            try
            {
                return MapiMessage.FromFile(files[position]);
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    public void Dispose()
    {
    }
}