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:

  1. Crea un nuovo OlmStorage istanza, passando una callback per la gestione delle eccezioni.
  2. Carica il file OLM chiamando il Load metodo.
  3. Se il file si carica correttamente, ottieni la gerarchia delle cartelle chiamando GetFolders.
  4. Itera ricorsivamente su ogni cartella. Per le cartelle che contengono messaggi, enumera i messaggi con il metodo dello storage EnumerateMessages metodo e processa ognuna di esse.
  5. 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);
    }
}