Skapa och hantera PST-filer

Förutom att parsra en befintlig PST-fil tillhandahåller Aspose.Email möjligheten att skapa en PST-fil från grunden. Denna artikel visar hur man skapar Outlook PST-filer och lägger till undermappar eller meddelanden i dem.

Skapa PST-filer

För att skapa en ny PST-fil på en lokal disk måste du använda PersonalStorage klass. Med den här klassen kan du skapa, läsa och manipulera PST-filer i dina .NET-applikationer. Skapa en lagringsfil från grunden med en rad kod:

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

Lägg till undermappar i PST

Lägg till en undermapp i rotkatalogen för PST-filen genom att komma åt Rot‑mappen och sedan anropa AddSubFolder metod.

Följande kodexempel visar hur du lägger till en undermapp som heter Inkorg:

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

Kontrollera mappars behållarklass

När du skapar nya mappar eller lägger till objekt i befintliga mappar är det viktigt att se till att behållarklassen för det nya objektet eller mappen överensstämmer med behållarklassen för föräldramappen för att upprätthålla den organisatoriska hierarkin i PST-lagringsfilen. För detta ändamål har Aspose.Email EnforceContainerClassMatching egenskap hos FolderCreationOptions klass. Egendomen specificerar om kontroll av mappens behållarklass mot föräldramappens behållarklass ska påtvingas. Om den är satt till ’true’ kastas ett undantag om behållarklasserna inte matchar. Standardvärdet är ‘false’.

Följande kodexempel demonstrerar användningen av EnforceContainerClassMatching egenskap för att styra om ett undantag ska kastas när mappar med icke‑matchande containerklasser läggs till:

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

Obs: Säkerställ korrekt hantering av undantag när du upprätthåller matchning av containerklasser för att förhindra oväntat beteende vid skapande av mappar i PST.

Ändra mappens containerklass

Ibland är det nödvändigt att ändra mappens containerklass. Ett vanligt exempel är när meddelanden av olika typer (möten, meddelanden osv.) läggs till i samma mapp. I sådana fall måste mappklassen ändras för alla element i mappen för att visas korrekt. Följande kodsnutt visar hur du ändrar containerklassen för en mapp i PST för detta ändamål.

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

folder.ChangeContainerClass("IPF.Note");

Lägga till filer i PST

Den viktigaste funktionen i Microsoft Outlook är att hantera e‑post, kalendrar, uppgifter, kontakter och journalanteckningar. Dessutom kan filer också läggas till i en PST-mapp och den resulterande PST-filen håller ett register över de tillagda dokumenten. Aspose.Email erbjuder möjlighet att lägga till filer i en mapp på samma sätt som med att lägga till meddelanden, kontakter, uppgifter och journalanteckningar i PST. Följande kodsnutt visar hur du lägger till dokument i en PST-mapp med 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);
}

Lägga till meddelanden i PST‑filer

Med Aspose.Email kan du lägga till meddelanden i undermappar i en PST-fil som du har skapat eller laddat. Denna artikel lägger till två meddelanden från disk till Inbox‑undermappen i en PST. Använd PersonalStorage och FolderInfo klasser för att lägga till meddelanden i PST‑filer. För att lägga till meddelanden i en PST‑filens Inkorg-mapp:

  1. Skapa en instans av FolderInfo-klassen och ladda den med innehållet i Inbox-mappen.
  2. Lägg till meddelanden från en disk till Inbox-mappen genom att anropa FolderInfo.AddMessage() metod. FolderInfo klassen exponerar AddMessages metod som möjliggör att lägga till ett stort antal meddelanden till mappen, vilket minskar I/O‑operationer till disken och förbättrar prestandan.

Kodsnutten nedan visar hur du lägger till meddelanden i PST‑undermappen 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"));

Lägg till meddelanden i bulk med förbättrad prestanda

Att lägga till enskilda meddelanden i en PST innebär fler I/O‑operationer till disken och kan sakta ner prestandan. För att förbättra prestandan kan meddelanden läggas till i PST i bulkläge för att minimera I/O‑operationer. AddMessages metod låter dig lägga till meddelanden i bulk och kan användas enligt följande scenarier. Dessutom, MessageAdded händelse inträffar när ett meddelande läggs till i mappen.

Lägg till meddelanden från en annan PST

För att lägga till meddelanden från en annan PST, använd FolderInfo.EnumerateMapiMessages metod som returnerar 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}");
}

Lägg till meddelanden från katalog

För att lägga till meddelanden från en katalog, skapa GetMessages(string pathToDir) namngiven iteratormetod som returnerar 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}");
}

Ladda meddelanden från disk

Följande kodsnutt visar hur du laddar meddelanden från en disk.

// 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-implementation

Följande kodsnutt visar hur IEnumerable-implementation kan användas.

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