Erstellen und Verwalten von PST‑Dateien

Neben dem Parsen einer bestehenden PST‑Datei bietet Aspose.Email die Möglichkeit, eine PST‑Datei von Grund auf zu erstellen. Dieser Artikel demonstriert, wie Outlook‑PST‑Dateien erstellt und Unterordner oder Nachrichten hinzugefügt werden können.

Erstellen von PST‑Dateien

Um eine neue PST‑Datei auf einer lokalen Festplatte zu erstellen, müssen Sie die PersonalStorage Klasse. Mit dieser Klasse können Sie PST‑Dateien in Ihren .NET‑Anwendungen erstellen, lesen und manipulieren. Erstellen Sie eine Speicherdatei von Grund auf mit einer Codezeile:

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

Unterordner zu PST hinzufügen

Fügen Sie einen Unterordner im Stammverzeichnis der PST‑Datei hinzu, indem Sie den Root‑Ordner öffnen und anschließend die AddSubFolder Methode.

Das folgende Code‑Snippet zeigt, wie Sie einen Unterordner namens Inbox hinzufügen:

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

Überprüfen Sie die Ordner-Containerklasse

Beim Erstellen neuer Ordner oder Hinzufügen von Elementen zu bestehenden Ordnern ist es wichtig, sicherzustellen, dass die Containerklasse des neuen Elements oder Ordners mit der Containerklasse des übergeordneten Ordners übereinstimmt, um die organisatorische Hierarchie innerhalb der PST‑Speicherdatei beizubehalten. Zu diesem Zweck verfügt Aspose.Email über die EnforceContainerClassMatching Eigenschaft des FolderCreationOptions Klasse. Die Eigenschaft gibt an, ob die Prüfung der Containerklasse des hinzuzufügenden Ordners gegen die Containerklasse des übergeordneten Ordners erzwungen werden soll. Wenn sie auf ’true’ gesetzt ist, wird eine Ausnahme ausgelöst, wenn die Containerklassen nicht übereinstimmen. Standard ist ‘false’.

Das folgende Codebeispiel demonstriert die Verwendung von EnforceContainerClassMatching Eigenschaft, um zu steuern, ob eine Ausnahme ausgelöst werden soll, wenn Ordner mit nicht übereinstimmenden Container‑Klassen hinzugefügt werden:

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

Hinweis: Stellen Sie eine ordnungsgemäße Behandlung von Ausnahmen sicher, wenn die Übereinstimmung der Container‑Klasse erzwungen wird, um unerwartetes Verhalten bei der Ordnererstellung in PST zu verhindern.

Ordner‑Container‑Klasse ändern

Manchmal ist es notwendig, die Container‑Klasse eines Ordners zu ändern. Ein häufiges Beispiel ist, wenn Nachrichten verschiedener Typen (Termine, Nachrichten usw.) in denselben Ordner eingefügt werden. In solchen Fällen muss die Ordnerklasse für alle Elemente im Ordner geändert werden, damit sie korrekt angezeigt werden. Der folgende Codeausschnitt zeigt, wie man die Container‑Klasse eines Ordners in einer PST zu diesem Zweck ändert.

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

folder.ChangeContainerClass("IPF.Note");

Dateien zu PST hinzufügen

Die Kernfunktionalität von Microsoft Outlook besteht darin, E‑Mails, Kalender, Aufgaben, Kontakte und Journaleinträge zu verwalten. Zusätzlich können Dateien zu einem PST‑Ordner hinzugefügt werden, wobei das resultierende PST einen Überblick über die hinzugefügten Dokumente behält. Aspose.Email bietet die Möglichkeit, Dateien auf dieselbe Weise zu einem Ordner hinzuzufügen, zusammen mit Nachrichten, Kontakten, Aufgaben und Journaleinträgen in PST. Der folgende Codeausschnitt zeigt, wie man Dokumente zu einem PST‑Ordner mit Aspose.Email hinzufügt.

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

Nachrichten zu PST‑Dateien hinzufügen

Mit Aspose.Email können Sie Nachrichten zu Unterordnern einer PST‑Datei hinzufügen, die Sie erstellt oder geladen haben. Dieser Artikel fügt zwei Nachrichten von der Festplatte zum Inbox‑Unterordner einer PST hinzu. Verwenden Sie die PersonalStorage und FolderInfo Klassen zum Hinzufügen von Nachrichten zu PST‑Dateien. Um Nachrichten zum Inbox‑Ordner einer PST‑Datei hinzuzufügen:

  1. Erstellen Sie eine Instanz der FolderInfo‑Klasse und laden Sie sie mit dem Inhalt des Inbox‑Ordners.
  2. Fügen Sie Nachrichten von einer Festplatte zum Inbox‑Ordner hinzu, indem Sie die FolderInfo.AddMessage() Methode. Die FolderInfo Klasse stellt das AddMessages Methode, die das Hinzufügen einer großen Anzahl von Nachrichten zum Ordner ermöglicht, I/O‑Operationen auf die Festplatte reduziert und die Leistung verbessert.

Der folgende Codeausschnitt zeigt, wie man Nachrichten zu einem PST‑Unterordner namens Inbox hinzufügt.

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

Nachrichten in Bulk mit verbesserter Leistung hinzufügen

Das Hinzufügen einzelner Nachrichten zu einer PST erfordert mehr I/O‑Operationen auf die Festplatte und kann die Leistung verlangsamen. Um die Leistung zu verbessern, können Nachrichten im Batch‑Modus zur PST hinzugefügt werden, um I/O‑Operationen zu minimieren. Die AddMessages Methode ermöglicht das Hinzufügen von Nachrichten in großen Mengen und kann in den folgenden Szenarien verwendet werden. Zusätzlich ist das MessageAdded Ereignis tritt auf, wenn eine Nachricht zum Ordner hinzugefügt wird.

Nachrichten aus anderer PST hinzufügen

Um Nachrichten aus einer anderen PST hinzuzufügen, verwenden Sie die FolderInfo.EnumerateMapiMessages Methode, die zurückgibt 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}");
}

Nachrichten aus Verzeichnis hinzufügen

Um Nachrichten aus einem Verzeichnis hinzuzufügen, erstellen Sie die GetMessages(string pathToDir) benannte Iterator‑Methode, die zurückgibt 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}");
}

Nachrichten von Festplatte laden

Der folgende Codeausschnitt zeigt, wie man Nachrichten von einer Festplatte lädt.

// 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‑Implementierung

Der folgende Codeausschnitt zeigt, wie die IEnumerable‑Implementierung verwendet werden kann.

// 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()
    {
    }
}