Tworzenie i zarządzanie plikami PST

Poza parsowaniem istniejącego pliku PST, Aspose.Email umożliwia stworzenie pliku PST od podstaw. Ten artykuł pokazuje, jak tworzyć pliki Outlook PST oraz dodawać do nich podfoldery lub wiadomości.

Tworzenie plików PST

Aby utworzyć nowy plik PST na dysku lokalnym, musisz użyć PersonalStorage klasa. Za pomocą tej klasy możesz tworzyć, odczytywać i manipulować plikami PST w aplikacjach .NET. Utwórz plik magazynu od podstaw jedną linią kodu:

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

Dodaj podfoldery do PST

Dodaj podfolder w katalogu głównym pliku PST, uzyskując dostęp do folderu Root i wywołując AddSubFolder metoda.

Poniższy fragment kodu pokazuje, jak dodać podfolder o nazwie Inbox:

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

Sprawdź klasę kontenera folderu

Podczas tworzenia nowych folderów lub dodawania elementów do istniejących folderów ważne jest zapewnienie, że klasa kontenera nowego elementu lub folderu jest zgodna z klasą kontenera folderu nadrzędnego, aby utrzymać hierarchię organizacyjną w pliku magazynu PST. w tym celu Aspose.Email posiada EnforceContainerClassMatching właściwość FolderCreationOptions klasa. Właściwość określa, czy wymusić sprawdzanie klasy kontenera folderu, który ma być dodany, względem klasy kontenera folderu nadrzędnego. Jeśli ustawiona na ’true’, zostanie zgłoszony wyjątek, jeśli klasy kontenerów nie będą się zgadzać. Domyślnie ‘false’.

Poniższy przykład kodu demonstruje użycie EnforceContainerClassMatching właściwość kontrolująca, czy ma być zgłaszany wyjątek przy dodawaniu folderów o niepasujących klasach kontenera:

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

Uwaga: zapewnij właściwą obsługę wyjątków przy wymuszaniu dopasowywania klasy kontenera, aby zapobiec nieoczekiwanemu zachowaniu podczas tworzenia folderu w PST.

Zmienianie klasy kontenera folderu

Czasami konieczna jest zmiana klasy kontenera folderu. Typowym przykładem jest sytuacja, w której wiadomości różnych typów (spotkania, wiadomości itp.) są dodawane do tego samego folderu. W takich przypadkach klasa folderu musi zostać zmieniona dla wszystkich elementów w folderze, aby wyświetlały się prawidłowo. Poniższy fragment kodu pokazuje, jak zmienić klasę kontenera folderu w PST w tym celu.

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

folder.ChangeContainerClass("IPF.Note");

Dodawanie plików do PST

Kluczową funkcjonalnością Microsoft Outlook jest zarządzanie e-mailami, kalendarzami, zadaniami, kontaktami i wpisami dziennika. Dodatkowo, pliki mogą być również dodawane do folderu PST, a powstały plik PST zachowuje zapis dodanych dokumentów. Aspose.Email udostępnia możliwość dodawania plików do folderu w ten sam sposób, co dodawanie wiadomości, kontaktów, zadań i wpisów dziennika do PST. Poniższy fragment kodu pokazuje, jak dodać dokumenty do folderu PST przy użyciu Aspose.Email.

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

Dodawanie wiadomości do plików PST

Z Aspose.Email możesz dodawać wiadomości do podfolderów pliku PST, który został utworzony lub załadowany. Ten artykuł dodaje dwie wiadomości z dysku do podfolderu Inbox w PST. Użyj PersonalStorage i FolderInfo klasy do dodawania wiadomości do plików PST. Aby dodać wiadomości do folderu Inbox w pliku PST:

  1. Utwórz instancję klasy FolderInfo i załaduj ją zawartością folderu Inbox.
  2. Dodaj wiadomości z dysku do folderu Inbox, wywołując FolderInfo.AddMessage() metoda. FolderInfo klasa udostępnia AddMessages metoda umożliwiająca dodanie dużej liczby wiadomości do folderu, redukująca operacje I/O na dysku i poprawiająca wydajność.

Poniższy fragment kodu pokazuje, jak dodać wiadomości do podfolderu PST o nazwie Inbox.

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

Dodaj wiadomości hurtowo z ulepszoną wydajnością

Dodawanie pojedynczych wiadomości do PST wiąże się z większą liczbą operacji I/O na dysku i może spowolnić wydajność. Aby poprawić wydajność, wiadomości mogą być dodawane do PST w trybie wsadowym, aby zminimalizować operacje I/O. AddMessages metoda pozwala na dodawanie wiadomości hurtowo i może być użyta w następujących scenariuszach. Ponadto MessageAdded zdarzenie występuje, gdy wiadomość zostaje dodana do folderu.

Dodaj wiadomości z innego PST

Aby dodać wiadomości z innego PST, użyj FolderInfo.EnumerateMapiMessages metoda, która zwraca 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}");
}

Dodaj wiadomości z katalogu

Aby dodać wiadomości z katalogu, utwórz GetMessages(string pathToDir) nazwana metoda iteratora, która zwraca 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}");
}

Ładowanie wiadomości z dysku

Poniższy fragment kodu pokazuje, jak załadować wiadomości z dysku.

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

Implementacja IEnumerable

Poniższy fragment kodu pokazuje, jak można wykorzystać implementację 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()
    {
    }
}