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:
- Crie uma instância da classe FolderInfo e carregue‑a com o conteúdo da pasta Inbox.
- 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()
{
}
}