Creazione e Gestione di File PST

Oltre all’analisi di un file PST esistente, Aspose.Email fornisce i mezzi per creare un file PST da zero. Questo articolo dimostra come creare file PST di Outlook e aggiungere loro sottocartelle o messaggi.

Creazione di file PST

Per creare un nuovo file PST su disco locale, sarà necessario utilizzare il PersonalStorage classe. Con questa classe, è possibile creare, leggere e manipolare file PST nelle proprie applicazioni .NET. Crea un file di archiviazione da zero con una riga di codice:

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

Aggiungi sottocartelle a PST

Aggiungi una sottocartella nella radice del file PST accedendo alla cartella Root e quindi chiamando il AddSubFolder metodo.

Il seguente frammento di codice mostra come aggiungere una sottocartella chiamata Inbox:

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

Verifica la classe contenitore della cartella

Quando si creano nuove cartelle o si aggiungono elementi a cartelle esistenti, è importante assicurarsi che la classe contenitore del nuovo elemento o cartella sia allineata con la classe contenitore della cartella genitore per mantenere la gerarchia organizzativa all’interno del file di archiviazione PST. A tal fine, Aspose.Email dispone di EnforceContainerClassMatching proprietà del FolderCreationOptions classe. La proprietà specifica se imporre il controllo della classe contenitore della cartella da aggiungere rispetto alla classe contenitore della cartella genitore. Se impostata su ’true’, verrà generata un’eccezione se le classi contenitore non corrispondono. Il valore predefinito è ‘false’.

Il seguente esempio di codice dimostra l’uso del EnforceContainerClassMatching proprietà per controllare se un’eccezione deve essere sollevata quando si aggiungono cartelle con classi contenitore non corrispondenti:

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

Nota: Assicurati di gestire correttamente le eccezioni quando imponi la corrispondenza della classe contenitore per prevenire comportamenti inattesi durante la creazione di cartelle in PST.

Modifica la Classe Contenitore della Cartella

A volte è necessario cambiare la classe contenitore della cartella. Un esempio comune è quando messaggi di tipi diversi (appuntamenti, messaggi, ecc.) vengono aggiunti alla stessa cartella. In tali casi, la classe della cartella deve essere cambiata per tutti gli elementi affinché vengano visualizzati correttamente. Il seguente frammento di codice mostra come cambiare la classe contenitore di una cartella in PST a questo scopo.

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

folder.ChangeContainerClass("IPF.Note");

Aggiunta di file al PST

La funzionalità chiave di Microsoft Outlook è la gestione di email, calendari, attività, contatti e voci di diario. Inoltre, è possibile aggiungere file a una cartella PST e il PST risultante tiene traccia dei documenti aggiunti. Aspose.Email fornisce la possibilità di aggiungere file a una cartella nello stesso modo insieme all’aggiunta di messaggi, contatti, attività e voci di diario al PST. Il seguente frammento di codice mostra come aggiungere documenti a una cartella PST usando 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);
}

Aggiunta di messaggi ai file PST

Con Aspose.Email puoi aggiungere messaggi alle sottocartelle di un file PST che hai creato o caricato. Questo articolo aggiunge due messaggi da disco alla sottocartella Inbox di un PST. Usa il PersonalStorage e FolderInfo classi per aggiungere messaggi ai file PST. Per aggiungere messaggi alla cartella Inbox di un file PST:

  1. Crea un’istanza della classe FolderInfo e caricala con il contenuto della cartella Inbox.
  2. Aggiungi messaggi da disco alla cartella Inbox chiamando il FolderInfo.AddMessage() metodo. Il FolderInfo la classe espone il AddMessages metodo che consente di aggiungere un gran numero di messaggi alla cartella, riducendo le operazioni I/O al disco e migliorando le prestazioni.

Il frammento di codice seguente mostra come aggiungere messaggi a una sottocartella PST chiamata 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"));

Aggiungere messaggi in blocco con prestazioni migliorate

Aggiungere messaggi individuali a un PST implica più operazioni I/O al disco e può rallentare le prestazioni. Per migliorarle, i messaggi possono essere aggiunti al PST in modalità bulk per ridurre al minimo le operazioni I/O. Il AddMessages il metodo consente di aggiungere messaggi in blocco e può essere usato nei seguenti scenari. Inoltre, il MessageAdded evento si verifica quando un messaggio viene aggiunto alla cartella.

Aggiungere messaggi da un altro PST

Per aggiungere messaggi da un altro PST, usa il FolderInfo.EnumerateMapiMessages metodo che restituisce 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}");
}

Aggiungere messaggi da directory

Per aggiungere messaggi da una directory, crea il GetMessages(string pathToDir) metodo iteratore nominato che restituisce 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}");
}

Carica Messaggi da Disco

Il seguente frammento di codice mostra come caricare i messaggi da disco.

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

Implementazione IEnumerable

Il seguente frammento di codice mostra come utilizzare l’Implementazione 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()
    {
    }
}