Vytváření a správa souborů PST

Kromě parsování existujícího souboru PST poskytuje Aspose.Email prostředky k vytvoření souboru PST od nuly. Tento článek demonstruje, jak vytvořit Outlook PST soubory a přidat do nich podsložky nebo zprávy.

Vytváření souborů PST

Pro vytvoření nového souboru PST na lokálním disku budete potřebovat použít PersonalStorage třída. S touto třídou můžete ve svých .NET aplikacích vytvářet, číst a manipulovat se soubory PST. Vytvořte úložný soubor od začátku jedním řádkem kódu:

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

Přidání podsložek do PST

Přidejte podsložku do kořene souboru PST přístupem ke kořenové složce a následným voláním AddSubFolder metoda.

Následující úryvek kódu vám ukazuje, jak přidat podsložku nazvanou Inbox:

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

Zkontrolujte třídu kontejneru složky

Při vytváření nových složek nebo přidávání položek do existujících složek je důležité zajistit, aby třída kontejneru nové položky nebo složky odpovídala třídě kontejneru nadřazené složky a tak udržela hierarchii organizace v souboru PST úložiště. K tomuto účelu má Aspose.Email EnforceContainerClassMatching vlastnost třídy FolderCreationOptions třída. Vlastnost určuje, zda vynutit kontrolu třídy kontejneru složky, která je přidávána, oproti třídě kontejneru nadřazené složky. Pokud je nastavena na ’true’, bude vyvolána výjimka, pokud se třídy kontejnerů neshodují. Výchozí hodnota je ‘false’.

Následující ukázka kódu demonstruje použití EnforceContainerClassMatching vlastnost pro řízení, zda má být vyhozena výjimka při přidávání složek s neodpovídajícími třídami kontejneru:

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

Poznámka: Zajistěte správné zacházení s výjimkami při vynucování shody tříd kontejneru, aby nedošlo k neočekávanému chování při vytváření složek v PST.

Změna třídy kontejneru složky

Někdy je nutné změnit třídu kontejneru složky. Běžný příklad je, když jsou do stejné složky přidány zprávy různých typů (schůzky, zprávy atd.). V takových případech je potřeba změnit třídu složky pro všechny prvky, aby se správně zobrazovaly. Následující ukázka kódu ukazuje, jak změnit třídu kontejneru složky v PST pro tento účel.

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

folder.ChangeContainerClass("IPF.Note");

Přidávání souborů do PST

Klíčová funkce Microsoft Outlooku je správa e‑mailů, kalendářů, úkolů, kontaktů a deníkových záznamů. Navíc lze do složky PST přidávat i soubory a výsledný PST uchovává záznam o přidaných dokumentech. Aspose.Email poskytuje možnost přidávat soubory do složky stejným způsobem jako přidávat zprávy, kontakty, úkoly a deníkové položky do PST. Následující ukázka kódu ukazuje, jak přidat dokumenty do složky PST pomocí 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);
}

Přidávání zpráv do souborů PST

S Aspose.Email můžete přidávat zprávy do podsložek souboru PST, který jste vytvořili nebo načetli. Tento článek přidává dvě zprávy z disku do podsložky Inbox v PST. Použijte PersonalStorage a FolderInfo třídy pro přidávání zpráv do souborů PST. Pro přidání zpráv do složky Inbox souboru PST:

  1. Vytvořte instanci třídy FolderInfo a načtěte ji obsahem složky Inbox.
  2. Přidejte zprávy z disku do složky Inbox voláním FolderInfo.AddMessage() metoda. FolderInfo třída vystavuje AddMessages metoda, která umožňuje přidat velký počet zpráv do složky, snížením I/O operací na disk a zlepšením výkonu.

Níže uvedená ukázka kódu ukazuje, jak přidat zprávy do podsložky PST nazvané 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"));

Přidat hromadné zprávy s vylepšeným výkonem

Přidávání jednotlivých zpráv do PST znamená více I/O operací na disk a může zpomalit výkon. Pro zlepšení výkonu lze zprávy do PST přidávat hromadně, aby se minimalizovaly I/O operace. AddMessages metoda vám umožňuje přidávat zprávy hromadně a může být použita v následujících scénářích. Navíc MessageAdded událost nastává, když je zpráva přidána do složky.

Přidat zprávy z jiného PST

Pro přidání zpráv z jiného PST použijte FolderInfo.EnumerateMapiMessages metoda, která vrací 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}");
}

Přidat zprávy z adresáře

Pro přidání zpráv z adresáře vytvořte GetMessages(string pathToDir) pojmenovaná metoda iteratoru, která vrací 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}");
}

Načtení zpráv z disku

Následující ukázka kódu ukazuje, jak načíst zprávy z disku.

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

Implementace IEnumerable

Následující ukázka kódu ukazuje, jak lze použít implementaci 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()
    {
    }
}