Trabalhando com grandes arquivos PST
Contents
[
Hide
]
O desempenho pode ser degradado ao processar grandes arquivos PST. As seguintes sugestões ajudarão você a melhorar o desempenho do seu aplicativo ao processar arquivos grandes.
Considere métodos que retornam
IEnumerable
ao percorrer pastas ou mensagens em um pst.
using var pst = PersonalStorage.FromFile(@"storage.pst");
foreach (var folder in pst.RootFolder.EnumerateFolders())
foreach (var messageInfo in folder.EnumerateMessages())
{
// Faça algo com a mensagem
}
Prefira MessageInfo para acessar propriedades básicas da mensagem.
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine($"Assunto: {messageInfo.Subject}");
Console.WriteLine($"Para: {messageInfo.DisplayTo}");
Console.WriteLine($"Importância: {messageInfo.Importance}");
Console.WriteLine($"Classe da Mensagem: {messageInfo.MessageClass}");
}
Evite usar os métodos ExtractMessage ou EnumerateMapiMessages para todas as mensagens, a menos que você precise ter acesso a todas as propriedades.
Considere usar EnumerateMessagesEntryId para recuperar facilmente todos os IDs das mensagens contidas em uma pasta.
foreach (var id in folder.EnumerateMessagesEntryId())
{
// Use id para recuperar uma propriedade (ExtractProperty),
// extrair uma MapiMessage (ExtractMessage),
// extrair anexos da mensagem (ExtractAttachments),
// salvar msg em um stream(SaveMessageToStream).
}
Considere usar ExtractProperty para ler uma única propriedade que está faltando no MessageInfo.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var transportMessageHeaders =
pst.ExtractProperty(Convert.FromBase64String(msgId), KnownPropertyList.TransportMessageHeaders.Tag)
.GetString();
}
Considere usar ExtractAttachments se apenas os anexos forem necessários.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var attachments = pst.ExtractAttachments(msgId);
}
Use filtragem baseada em critérios de busca para obter as mensagens que você precisa.
using var pst = PersonalStorage.FromFile(@"storage.pst");
var builder = new PersonalStorageQueryBuilder();
// Mensagens não lidas
builder.HasNoFlags(MapiMessageFlags.MSGFLAG_READ);
foreach (var folder in pst.RootFolder.EnumerateFolders())
{
var unread = folder.GetContents(builder.GetQuery());
}
Considere usar SaveMessageToStream se for necessário salvar mensagens de um pst.
Em vez de usar:
foreach (var id in folder.EnumerateMessagesEntryId())
{
var msg = pst.ExtractMessage(id);
msg.Save(@"message.msg");
}
Use:
foreach (var id in folder.EnumerateMessagesEntryId())
{
pst.SaveMessageToStream(id, File.OpenWrite(@"message.msg"));
}