Hello @MaazHussain,
To optimize your file parsing, we recommend using the EnumerateMessagesEntryId() method. This approach retrieves only the message entry IDs first, reducing unnecessary processing, and then extracts messages as needed:
public static string GetMailListAsJson(string emailFilePath, string folderEntryId)
{
var pst = PersonalStorage.FromFile(emailFilePath);
var targetFolder = pst.GetFolderById(folderEntryId);
var mailDetailsList = new List<MailListInfo>();
foreach (var entryId in targetFolder.EnumerateMessagesEntryId())
{
try
{
var msg = pst.ExtractMessage(entryId);
var mailDetail = new MailListInfo
{
MessageId = entryId.ToString(),
Subject = msg.Subject ?? "No Subject",
Sender = msg.SenderEmailAddress ?? msg.SenderName ?? "Unknown Sender",
Content = (msg.Body?.Length > 100 ? msg.Body.Substring(0, 100) + "..." : msg.Body) ?? "No Content",
HasAttachments = msg.Attachments?.Count > 0
};
mailDetailsList.Add(mailDetail);
}
catch (Exception ex)
{
Console.WriteLine($"Error processing message: {ex.Message}");
}
}
return JsonConvert.SerializeObject(mailDetailsList);
}
private static MailDetailInfo ProcessFolderForMessage(PersonalStorage pst, FolderInfo folder, string messageId)
{
foreach (var entryId in folder.EnumerateMessagesEntryId())
{
try
{
var msg = pst.ExtractMessage(entryId);
return new MailDetailInfo
{
Subject = msg.Subject ?? "No Subject",
Sender = msg.SenderEmailAddress ?? "Unknown Sender",
ContentHtml = msg.BodyHtml ?? msg.Body ?? "No Content",
Recipients = GetRecipients(msg),
Attachments = GetAttachments(msg)
};
}
catch (Exception ex)
{
Console.WriteLine($"Error processing message: {ex.Message}");
}
}
return null;
}
Alternatively, you can use EnumerateMapiMessages(), which eliminates the need for separate message extraction:
public static string GetMailListAsJson(string emailFilePath, string folderEntryId)
{
var pst = PersonalStorage.FromFile(emailFilePath);
var targetFolder = pst.GetFolderById(folderEntryId);
var mailDetailsList = new List<MailListInfo>();
foreach (var msg in targetFolder.EnumerateMapiMessages())
{
try
{
var mailDetail = new MailListInfo
{
MessageId = msg.EntryIdString,
Subject = msg.Subject ?? "No Subject",
Sender = msg.SenderEmailAddress ?? msg.SenderName ?? "Unknown Sender",
Content = (msg.Body?.Length > 100 ? msg.Body.Substring(0, 100) + "..." : msg.Body) ?? "No Content",
HasAttachments = msg.Attachments?.Count > 0
};
mailDetailsList.Add(mailDetail);
}
catch (Exception ex)
{
Console.WriteLine($"Error processing message: {ex.Message}");
}
}
return JsonConvert.SerializeObject(mailDetailsList);
}
private static MailDetailInfo ProcessFolderForMessage(PersonalStorage pst, FolderInfo folder, string messageId)
{
foreach (var msg in folder.EnumerateMapiMessages())
{
try
{
return new MailDetailInfo
{
Subject = msg.Subject ?? "No Subject",
Sender = msg.SenderEmailAddress ?? "Unknown Sender",
ContentHtml = msg.BodyHtml ?? msg.Body ?? "No Content",
Recipients = GetRecipients(msg),
Attachments = GetAttachments(msg)
};
}
catch (Exception ex)
{
Console.WriteLine($"Error processing message: {ex.Message}");
}
}
return null;
}
Additionally, please review our article on working with large PST files.
It’s important to note that performance largely depends on the structure of your messages, such as the size of the HTML body, the presence and size of attachments, and other factors. These optimizations help minimize unnecessary processing and improve efficiency.