Lettura ed estrazione di messaggi OLM
Dopo aver aperto un file OLM e individuato una cartella, è possibile elencare i suoi messaggi, leggere informazioni brevi sui messaggi, filtrare e paginare cartelle grandi, ed estrarre messaggi individuali come MapiMessage oggetti. Questo articolo copre tutte queste operazioni.
Elenca i Messaggi in una Cartella
Il OlmFolder classe fornisce due modalità per iterare sui messaggi che contiene:
- EnumerateMessages restituisce un OlmMessageInfo oggetto in ogni iterazione. Questo oggetto contiene informazioni brevi sul messaggio ed è il modo più efficiente per scansionare una cartella.
- EnumerateMapiMessages restituisce un MapiMessage oggetto in ogni iterazione, con tutte le proprietà del messaggio caricate.
Usando EnumerateMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}
Usando 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");
}
}
Leggi le Informazioni del Messaggio
Ogni OlmMessageInfo l’oggetto espone un insieme di proprietà di sola lettura che descrivono un messaggio senza caricarne il contenuto completo. Questo è il modo più efficiente per costruire una visualizzazione a elenco o decidere quali messaggi estrarre.
| Proprietà | Descrizione | | — | — | | Subject | L’oggetto del messaggio. | | From | L’indirizzo del mittente. | | A | La collezione di indirizzi dei destinatari. | | Date | La data del messaggio. | | DataModifica | La data in cui il messaggio è stato modificato l’ultima volta. | | HasAttachments | Indica se il messaggio ha allegati. | | MessageClass | Classe del messaggio definita dal mittente, come IPM.Note. |
| EntryId | Identificatore di voce del messaggio. |
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));
}
}
Ottieni la Data di Modifica di un Messaggio
La data di modifica rappresenta la data e l’ora in cui il messaggio OLM è stato modificato l’ultima volta. Usa la OlmMessageInfo.ModifiedDate proprietà per leggerla:
foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
DateTime modifiedDate = messageInfo.ModifiedDate;
}
Filtra Messaggi con una Query
Per cartelle grandi, puoi recuperare solo i messaggi che corrispondono a un insieme di criteri invece di iterare su tutto. Passa un MailQuery al EnumerateMessages(MailQuery query) sovraccarico. Costruisci la query con un MailQueryBuilder.
L’esempio sotto enumera solo i messaggi ricevuti negli ultimi sette giorni il cui oggetto contiene la parola "Fattura":
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);
}
}
Scorri i Messaggi a Pagina
Quando una cartella contiene un gran numero di messaggi, puoi leggerli in blocchi con il EnumerateMessages(int skip, int count) sovraccarico. Il skip il parametro è il numero di messaggi da saltare, e count è il numero di messaggi da restituire.
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++;
}
}
Estrai un Messaggio come MapiMessage
Il OlmStorage classe fornisce il ExtractMapiMessage metodo, che estrae un messaggio completo MapiMessage da un OlmMessageInfo oggetto. Questo è utile quando prima scansioni una cartella con EnumerateMessages e poi estrarre solo i messaggi realmente necessari.
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");
}
}
}
Estrai Messaggi per Identificatore
A volte è necessario estrarre messaggi selezionati tramite i loro identificatori. Per esempio, un’applicazione può memorizzare gli identificatori in un database e estrarre un messaggio su richiesta invece di attraversare l’intero storage ogni volta. Il EntryId proprietà di OlmMessageInfo fornisce l’identificatore di voce del messaggio, e il sovraccarico ExtractMapiMessage(string id) metodo recupera il messaggio per quell’identificatore.
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);
}
}
Estrai Elementi Usando l’API di Traversa
Puoi estrarre ogni elemento da un file OLM - per quanto possibile - senza generare eccezioni, anche quando alcuni dati nel file originale sono corrotti. Per fare ciò, crea il OlmStorage istanza con il OlmStorage(TraversalExceptionsCallback callback) costruttore e carica il file con il Load metodo. La callback espone le eccezioni di caricamento e traversa.
Il Load metodo restituisce true se il file è stato caricato correttamente e la traversa è possibile, e false se il file è corrotto e non è possibile effettuare la traversa. Nota che quando si attraversano gli elementi cartella per cartella, chiami il metodo dello storage EnumerateMessages(OlmFolder folder) metodo, passando la cartella come argomento.
I passaggi sono:
- Crea un nuovo OlmStorage istanza, passando una callback per la gestione delle eccezioni.
- Carica il file OLM chiamando il Load metodo.
- Se il file si carica correttamente, ottieni la gerarchia delle cartelle chiamando GetFolders.
- Itera ricorsivamente su ogni cartella. Per le cartelle che contengono messaggi, enumera i messaggi con il metodo dello storage
EnumerateMessagesmetodo e processa ognuna di esse. - Ricorri in tutte le sottocartelle.
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);
}
}