处理大型 PST 文件
Contents
[
Hide
]
处理大型 PST 文件时,性能可能会下降。以下解决方案可帮助您在处理大型存储文件时提升应用性能。
考虑使用返回
IEnumerable 在遍历 PST 中的文件夹或邮件时。
using var pst = PersonalStorage.FromFile(@"storage.pst");
foreach (var folder in pst.RootFolder.EnumerateFolders())
foreach (var messageInfo in folder.EnumerateMessages())
{
// Do something with message
}
首选 MessageInfo 的方法来访问基本邮件属性。
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine($"Subject: {messageInfo.Subject}");
Console.WriteLine($"To: {messageInfo.DisplayTo}");
Console.WriteLine($"Importance: {messageInfo.Importance}");
Console.WriteLine($"Message Class: {messageInfo.MessageClass}");
}
避免使用 ExtractMessage 或 EnumerateMapiMessages 方法来处理所有邮件,除非您需要访问所有属性。
考虑使用 EnumerateMessagesEntryId 以轻松检索文件夹中所有邮件 ID。
foreach (var id in folder.EnumerateMessagesEntryId())
{
// Use id to retrieve a property (ExtractProperty),
// extract a MapiMessage (ExtractMessage),
// extarct message attachments (ExtractAttachments),
// save msg to a stream(SaveMessageToStream).
}
考虑使用 ExtractProperty 来读取 MessageInfo 中缺失的单个属性。
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var transportMessageHeaders =
pst.ExtractProperty(Convert.FromBase64String(msgId), KnownPropertyList.TransportMessageHeaders.Tag)
.GetString();
}
考虑使用 ExtractAttachments 如果仅需要附件。
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var attachments = pst.ExtractAttachments(msgId);
}
使用 按条件搜索-based 过滤以获取所需的邮件。
using var pst = PersonalStorage.FromFile(@"storage.pst");
var builder = new PersonalStorageQueryBuilder();
// Unread messages
builder.HasNoFlags(MapiMessageFlags.MSGFLAG_READ);
foreach (var folder in pst.RootFolder.EnumerateFolders())
{
var unread = folder.GetContents(builder.GetQuery());
}
考虑使用 SaveMessageToStream 如果需要从 PST 保存邮件。
而不是使用:
foreach (var id in folder.EnumerateMessagesEntryId())
{
var msg = pst.ExtractMessage(id);
msg.Save(@"message.msg");
}
使用:
foreach (var id in folder.EnumerateMessagesEntryId())
{
pst.SaveMessageToStream(id, File.OpenWrite(@"message.msg"));
}