Čtení a extrakce OLM zpráv
Po otevření souboru OLM a nalezení složky můžete vypsat její zprávy, přečíst stručné informace o zprávě, filtrovat a stránkovat velké složky a extrahovat jednotlivé zprávy jako MapiMessage objekty. Tento článek pokrývá všechny tyto operace.
Vypsat zprávy ve složce
The OlmFolder třída poskytuje dva způsoby, jak iterovat přes zprávy, které obsahuje:
- EnumerateMessages vrací OlmMessageInfo objekt v každé iteraci. Tento objekt obsahuje stručné informace o zprávě a je nejefektivnějším způsobem, jak procházet složku.
- EnumerateMapiMessages vrací kompletní MapiMessage objekt v každé iteraci, se všemi načtenými vlastnostmi zprávy.
Použití EnumerateMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}
Použití EnumerateMapiMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var msg in folder.EnumerateMapiMessages())
{
// save the message in MSG format
msg.Save($"{msg.Subject}.msg");
}
}
Číst informace o zprávě
Každý OlmMessageInfo objekt vystavuje sadu pouze pro čtení vlastností popisujících zprávu bez načítání jejího úplného obsahu. Toto je nejefektivnější způsob, jak vytvořit seznamový pohled nebo rozhodnout, které zprávy extrahovat.
| Vlastnost | Popis | | — | — | | Subject | Předmět zprávy. | | From | Adresa odesílatele. | | To | Kolekce adres příjemců. | | Date | Datum zprávy. | | DatumÚpravy | Datum poslední úpravy zprávy. | | HasAttachments | Udává, zda zpráva má přílohy. | | MessageClass | Třída zprávy definovaná odesílatelem, např. IPM.Note. |
| EntryId | Identifikátor vstupu zprávy. |
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (OlmMessageInfo messageInfo in folder.EnumerateMessages())
{
Console.WriteLine($"Subject: {messageInfo.Subject}");
Console.WriteLine($"From: {messageInfo.From}");
Console.WriteLine($"To: {string.Join("; ", messageInfo.To)}");
Console.WriteLine($"Date: {messageInfo.Date}");
Console.WriteLine($"Modified: {messageInfo.ModifiedDate}");
Console.WriteLine($"Has attachments: {messageInfo.HasAttachments}");
Console.WriteLine($"Message class: {messageInfo.MessageClass}");
Console.WriteLine(new string('-', 30));
}
}
Získat upravené datum zprávy
Upravené datum představuje datum a čas, kdy byla OLM zpráva naposledy upravena. Použijte OlmMessageInfo.ModifiedDate vlastnost pro jeho přečtení:
foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
DateTime modifiedDate = messageInfo.ModifiedDate;
}
Filtrujte zprávy pomocí dotazu
Pro velké složky můžete získat pouze zprávy, které splňují určitá kritéria, místo iterace přes vše. Předávejte MailQuery na EnumerateMessages(MailQuery query) přetížení. Sestavte dotaz pomocí MailQueryBuilder.
Níže uvedený příklad enumeruje pouze zprávy přijaté během posledních sedmi dnů, jejichž předmět obsahuje slovo „Invoice“:
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
var builder = new MailQueryBuilder();
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
builder.Subject.Contains("Invoice");
MailQuery query = builder.GetQuery();
foreach (var messageInfo in folder.EnumerateMessages(query))
{
Console.WriteLine(messageInfo.Subject);
}
}
Stránkovat zprávy
Když složka obsahuje velké množství zpráv, můžete je číst po dávkách pomocí EnumerateMessages(int skip, int count) přetížení. Metoda skip parametr je počet zpráv, které mají být přeskočeny, a count je počet zpráv, které mají být vráceny.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
const int pageSize = 50;
int pageIndex = 0;
while (true)
{
var page = folder.EnumerateMessages(pageIndex * pageSize, pageSize).ToList();
if (page.Count == 0)
{
break;
}
foreach (var messageInfo in page)
{
Console.WriteLine(messageInfo.Subject);
}
pageIndex++;
}
}
Extrahovat zprávu jako MapiMessage
The OlmStorage třída poskytuje ExtractMapiMessage metoda, která extrahuje kompletní MapiMessage z OlmMessageInfo objekt. To je užitečné, když nejprve skenujete složku pomocí EnumerateMessages a poté extrahovat pouze zprávy, které skutečně potřebujete.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
if (messageInfo.Date.Date == DateTime.Today)
{
// extract today's messages from Inbox
var msg = olm.ExtractMapiMessage(messageInfo);
msg.Save($"{msg.Subject}.msg");
}
}
}
Extrahovat zprávy podle identifikátoru
Někdy potřebujete extrahovat vybrané zprávy podle jejich identifikátorů. Například aplikace může ukládat identifikátory v databázi a extrahovat zprávu na požádání místo opakovaného procházení celého úložiště. Tento EntryId vlastnost třídy OlmMessageInfo poskytuje identifikátor vstupu zprávy a přetížená ExtractMapiMessage(string id) metoda získá zprávu podle tohoto identifikátoru.
using (var olm = OlmStorage.FromFile(fileName))
{
var olmFolder = olm.GetFolder("Inbox", true);
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
// store msgInfo.EntryId somewhere, then later:
MapiMessage msg = olm.ExtractMapiMessage(msgInfo.EntryId);
}
}
Extrahovat položky pomocí Traversal API
Můžete extrahovat každou položku z OLM souboru – pokud je to možné – bez vyhazování výjimek, i když jsou některá data v původním souboru poškozena. K tomu vytvořte OlmStorage instance s OlmStorage(TraversalExceptionsCallback callback) konstruktor a načtěte soubor pomocí Load metoda. Callback vystavuje výjimky při načítání a procházení.
The Load metoda vrací true pokud byl soubor načten úspěšně a procházení je možné, a false pokud je soubor poškozený a není možné jej projít. Všimněte si, že při procházení položek složka po složce voláte úložiště EnumerateMessages(OlmFolder folder) metoda, předávající složku jako argument.
Kroky jsou:
- Vytvořit nový OlmStorage instance, předáním callbacku pro zpracování výjimek.
- Načtěte soubor OLM voláním Load metoda.
- Pokud se soubor načte úspěšně, získejte hierarchii složek voláním GetFolders.
- Rekurzivně iterovat přes každou složku. Pro složky, které obsahují zprávy, je enumerovat pomocí úložiště
EnumerateMessagesmetoda a zpracovat každou z nich. - Rekurzivně vstoupit do všech pod‑složek.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling code. */ }))
{
if (olm.Load(fileName))
{
var folderHierarchy = olm.GetFolders();
ExtractItems(olm, folderHierarchy);
}
}
private static void ExtractItems(OlmStorage olm, IEnumerable<OlmFolder> folders)
{
foreach (var folder in folders)
{
if (folder.HasMessages)
{
Console.WriteLine(folder);
foreach (var msg in olm.EnumerateMessages(folder))
{
Console.WriteLine(msg.Subject);
}
}
ExtractItems(olm, folder.SubFolders);
}
}