Crear y administrar archivos PST

Además de analizar un archivo PST existente, Aspose.Email ofrece los medios para crear un archivo PST desde cero. Este artículo muestra cómo crear archivos PST de Outlook y agregar subcarpetas o mensajes a ellos.

Crear archivos PST

Para crear un nuevo archivo PST en un disco local, necesitarás usar la PersonalStorage clase. Con esta clase, puedes crear, leer y manipular archivos PST en tus aplicaciones .NET. Crea un archivo de almacenamiento desde cero con una línea de código:

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

Agregar subcarpetas a PST

Añade una subcarpeta en la raíz del archivo PST accediendo a la carpeta Root y luego llamando al AddSubFolder método.

El siguiente fragmento de código muestra cómo agregar una subcarpeta llamada Inbox:

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

Verificar la clase contenedora de la carpeta

Al crear nuevas carpetas o agregar elementos a carpetas existentes, es importante asegurarse de que la clase contenedora del nuevo elemento o carpeta coincida con la clase contenedora de la carpeta padre para mantener la jerarquía organizacional dentro del archivo de almacenamiento PST. Con este fin, Aspose.Email dispone de la EnforceContainerClassMatching propiedad del FolderCreationOptions clase. La propiedad especifica si se debe aplicar la verificación de la clase contenedora de la carpeta que se está agregando contra la clase contenedora de la carpeta padre. Si se establece en ’true’, se lanzará una excepción si las clases contenedoras no coinciden. El valor predeterminado es ‘false’.

El siguiente ejemplo de código demuestra el uso del EnforceContainerClassMatching propiedad para controlar si se debe lanzar una excepción al agregar carpetas con clases contenedoras que no coinciden:

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: Asegúrese de manejar correctamente las excepciones al aplicar la coincidencia de clases contenedoras para evitar comportamientos inesperados durante la creación de carpetas en PST.

Cambiar la clase contenedora de la carpeta

A veces es necesario cambiar la clase contenedora de la carpeta. Un ejemplo común es cuando se agregan mensajes de diferentes tipos (citas, mensajes, etc.) a la misma carpeta. En tales casos, la clase de la carpeta debe cambiarse para que todos los elementos se muestren correctamente. El siguiente fragmento de código muestra cómo cambiar la clase contenedora de una carpeta en PST para este propósito.

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

folder.ChangeContainerClass("IPF.Note");

Agregar archivos al PST

Las funcionalidades clave de Microsoft Outlook son la gestión de correos electrónicos, calendarios, tareas, contactos y entradas de diario. Además, también se pueden agregar archivos a una carpeta PST y el PST resultante mantiene un registro de los documentos añadidos. Aspose.Email ofrece la capacidad de agregar archivos a una carpeta de la misma manera que se agregan mensajes, contactos, tareas y entradas de diario al PST. El siguiente fragmento de código muestra cómo agregar documentos a una carpeta 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);
}

Agregar Mensajes a Archivos PST

Con Aspose.Email puede agregar mensajes a subcarpetas de un archivo PST que haya creado o cargado. Este artículo agrega dos mensajes desde el disco a la subcarpeta Inbox de un PST. Use el PersonalStorage y FolderInfo clases para agregar mensajes a archivos PST. Para agregar mensajes a la carpeta Inbox de un archivo PST:

  1. Cree una instancia de la clase FolderInfo y cárguela con el contenido de la carpeta Inbox.
  2. Agregar mensajes desde un disco a la carpeta Inbox llamando al FolderInfo.AddMessage() método. El FolderInfo La clase expone el AddMessages método que permite agregar una gran cantidad de mensajes a la carpeta, reduciendo las operaciones de E/S al disco y mejorando el rendimiento.

El fragmento de código a continuación muestra cómo agregar mensajes a una subcarpeta de PST llamada 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"));

Añadir mensajes en bloque con rendimiento mejorado

Agregar mensajes individuales a un PST implica más operaciones de E/S al disco y puede ralentizar el rendimiento. Para mejorar el rendimiento, los mensajes pueden agregarse al PST en modo masivo para minimizar las operaciones de E/S. El AddMessages el método te permite añadir mensajes en bloque y puede usarse en los siguientes escenarios. Además, el MessageAdded evento que ocurre cuando se añade un mensaje a la carpeta.

Añadir mensajes desde otro PST

Para añadir mensajes desde otro PST, usa el FolderInfo.EnumerateMapiMessages método que devuelve 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}");
}

Añadir mensajes desde directorio

Para añadir mensajes desde un directorio, crea el GetMessages(string pathToDir) método iterador con nombre que devuelve 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}");
}

Cargar mensajes desde disco

El siguiente fragmento de código muestra cómo cargar mensajes desde un 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);
}

Implementación de IEnumerable

El siguiente fragmento de código muestra cómo se puede usar la implementación de 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()
    {
    }
}