Criando e Gerenciando Arquivos PST

Além de analisar um arquivo PST existente, o Aspose.Email oferece meios para criar um arquivo PST do zero. Este artigo demonstra como criar arquivos PST do Outlook e adicionar subpastas ou mensagens a eles.

Criando Arquivos PST

Para criar um novo arquivo PST em um disco local, você precisará usar o PersonalStorage classe. Com esta classe, você pode criar, ler e manipular arquivos PST em suas aplicações .NET. Crie um arquivo de armazenamento do zero com uma linha de código:

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

Adicionar Subpastas ao PST

Adicione uma subpasta na raiz do arquivo PST acessando a pasta Root e então chamando o AddSubFolder método.

O trecho de código a seguir mostra como adicionar uma subpasta chamada Inbox:

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

Verificar a Classe do Contêiner da Pasta

Ao criar novas pastas ou adicionar itens a pastas existentes, é importante garantir que a classe do contêiner do novo item ou pasta esteja alinhada com a classe do contêiner da pasta pai para manter a hierarquia organizacional dentro do arquivo de armazenamento PST. Para esse fim, o Aspose.Email possui o EnforceContainerClassMatching propriedade do FolderCreationOptions classe. A propriedade especifica se deve impor a verificação da classe do contêiner da pasta que está sendo adicionada em relação à classe do contêiner da pasta pai. Se definido como ’true’, uma exceção será lançada se as classes do contêiner não coincidirem. O padrão é ‘false’.

O exemplo de código a seguir demonstra o uso do EnforceContainerClassMatching propriedade para controlar se uma exceção deve ser lançada ao adicionar pastas com classes de contêiner incompatíveis:

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

Observação: Garanta o tratamento adequado de exceções ao impor a correspondência de classes de contêiner para evitar comportamento inesperado durante a criação de pastas no PST.

Alterar a Classe do Contêiner da Pasta

Às vezes é necessário mudar a classe do contêiner da pasta. Um exemplo comum é quando mensagens de tipos diferentes (compromissos, mensagens, etc.) são adicionadas à mesma pasta. Nesses casos, a classe da pasta precisa ser alterada para que todos os elementos na pasta sejam exibidos corretamente. O trecho de código a seguir mostra como mudar a classe do contêiner de uma pasta no PST para esse propósito.

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

folder.ChangeContainerClass("IPF.Note");

Adicionando arquivos ao PST

A funcionalidade principal do Microsoft Outlook é gerenciar e‑mails, calendários, tarefas, contatos e entradas de diário. Além disso, arquivos também podem ser adicionados a uma pasta PST e o PST resultante mantém um registro dos documentos adicionados. Aspose.Email fornece a facilidade de adicionar arquivos a uma pasta da mesma forma que adiciona mensagens, contatos, tarefas e entradas de diário ao PST. O trecho de código a seguir mostra como adicionar documentos a uma pasta 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);
}

Adicionando Mensagens a Arquivos PST

Com Aspose.Email você pode adicionar mensagens a subpastas de um arquivo PST que você criou ou carregou. Este artigo adiciona duas mensagens do disco à subpasta Inbox de um PST. Use o PersonalStorage e FolderInfo Classes para adicionar mensagens a arquivos PST. Para adicionar mensagens à pasta Inbox de um arquivo PST:

  1. Crie uma instância da classe FolderInfo e carregue‑a com o conteúdo da pasta Inbox.
  2. Adicione mensagens de um disco à pasta Inbox chamando o FolderInfo.AddMessage() método. O FolderInfo A classe expõe o AddMessages método que permite adicionar um grande número de mensagens à pasta, reduzindo as operações de I/O no disco e melhorando o desempenho.

O trecho de código abaixo mostra como adicionar mensagens a uma subpasta PST chamada 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"));

Adicionar Mensagens em Massa com Desempenho Aprimorado

Adicionar mensagens individuais a um PST implica mais operações de I/O no disco e pode diminuir o desempenho. Para melhorar o desempenho, as mensagens podem ser adicionadas ao PST em modo em lote para minimizar as operações de I/O. O AddMessages método permite que você adicione mensagens em massa e pode ser usado nos seguintes cenários. Além disso, o MessageAdded evento ocorre quando uma mensagem é adicionada à pasta.

Adicionar Mensagens de Outro PST

Para adicionar mensagens de outro PST, use o FolderInfo.EnumerateMapiMessages método que retorna 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}");
}

Adicionar Mensagens de Diretório

Para adicionar mensagens de um diretório, crie o GetMessages(string pathToDir) método iterador nomeado que retorna 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}");
}

Carregar Mensagens do Disco

O trecho de código a seguir mostra como carregar mensagens de um 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);
}

Implementação IEnumerable

O trecho de código a seguir mostra como a Implementação de IEnumerable pode ser usada.

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