Gestisci messaggi email e allegati con Microsoft Graph

Aspose.Email IGraphClient fornisce un’ampia gamma di metodi per gestire i messaggi email e i relativi allegati tramite Microsoft Graph.

Operazioni disponibili:

  • Elenca i messaggi

  • Filtra e sfoglia i messaggi

  • Recupera il contenuto del messaggio

  • Crea e invia messaggi (incluse bozze e EML)

  • Copia e sposta i messaggi

  • Gestisci gli allegati (crea, recupera, elimina, elenca)

Elenca messaggi

Per recuperare i messaggi da una cartella, ad esempio "Posta in arrivo", usa il ListMessages metodo.

  1. Recupera l’elenco delle cartelle usando client.ListFolders().
  2. Itera attraverso ogni cartella.
  3. Verifica se il nome visualizzato della cartella è "Inbox".
  4. Se lo è, elenca i messaggi nella Posta in arrivo usando client.ListMessages(folder.ItemId).
  5. Itera attraverso ogni messaggio nella Posta in arrivo.
  6. Stampa l’oggetto di ogni messaggio sulla console.
var folders = client.ListFolders();

foreach (var folder in folders)
{
    if (folder.DisplayName.Equals("Inbox"))
    {
        // list messages in inbox
        var inboxMessages = client.ListMessages(folder.ItemId);

        foreach (var messageInfo in inboxMessages)
        {
            Console.WriteLine(messageInfo.Subject);
        }
    }
}

Elenca messaggi asincronamente con Microsoft Graph

Il seguente esempio di codice dimostra come accedere alla cartella Posta in arrivo, recuperare una pagina di messaggi email con ListMessagesAsync, e stampa i loro oggetti:

var folders = await client.ListFoldersAsync();
foreach (var folder in folders)
{
    Console.WriteLine(folder.DisplayName);
}

var folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgsPage = await client.ListMessagesAsync(folderId, new PageInfo(15) { PageOffset = 0 }, null);
var msgs = msgsPage.Items;
foreach (var msg in msgs)
{
    Console.WriteLine(msg.Subject);
}

Filtra messaggi per data di invio

Il OrderBy il metodo della collezione della libreria consente di recuperare i messaggi con diversi ordini di ordinamento (ascendente e discendente) basati sulla data di invio. Il seguente esempio di codice mostra come ordinare i messaggi per data di invio:

  1. Inizializza il Graph Client

  2. Crea Query Builder

  3. Ordina i messaggi per data in:

  • Ordine discendente

    • Usa builder.SentDate.OrderBy(false) per impostare l’ordine a discendente.
    • Chiama client.ListMessages() per ottenere messaggi dalla Posta in arrivo con un limite di 10, usando la query da builder.GetQuery().
    • Memorizza i messaggi recuperati nella variabile messages.
  • Ordine crescente

    • Imposta l’ordine a crescente chiamando builder.SentDate.OrderBy(true).
    • Usa client.ListMessages() di nuovo per recuperare i messaggi dalla Posta in arrivo, ora in ordine crescente.
    • Memorizza questi messaggi nella variabile messages.
IGraphClient client = GraphClient.GetClient(provider, TenantId);

var builder = new GraphQueryBuilder();

// create orderby messages query 'DESC'
builder.SentDate.OrderBy(false);
var messagePageInfo = client.ListMessages(KnownFolders.Inbox, new PageInfo(10), builder.GetQuery());
var messages = messagePageInfo.Items;

builder.Clear();

// create orderby messages query 'ASC'
builder.SentDate.OrderBy(true);
messagePageInfo = client.ListMessages(KnownFolders.Inbox, new PageInfo(10), builder.GetQuery());
messages = messagePageInfo.Items;

Elenca messaggi con paginazione e filtraggio

Usa la paginazione quando lavori con caselle di posta grandi. L’esempio sotto recupera i messaggi non letti in pagine di 10 e li segna come letti dopo l’elaborazione:

  1. Inizializza il client.
  2. Imposta il numero di elementi da visualizzare per pagina, per esempio, 10.
  3. Crea un filtro per recuperare solo i messaggi non letti usando il GraphQueryBuilder classe. Il builder.IsRead.Equals(false) imposta la condizione per filtrare i messaggi non letti.
  4. Chiama il ListMessages metodo sull’oggetto client, specificando la cartella (Inbox) e gli elementi per pagina (PageInfo(itemsPerPage)) come parametri. Passa anche l’oggetto query per applicare il filtro dei messaggi non letti. L’oggetto PageInfo restituito (pageInfo) contiene i messaggi recuperati per la pagina corrente nella proprietà Items.
  5. Crea un ciclo che continua finché non si raggiunge l’ultima pagina (pageInfo.LastPage è false). I messaggi recuperati vengono aggiunti all’elenco dei messaggi esistenti usando messages.AddRange(pageInfo.Items).
//  reading unread messages with paging
using var client = GraphClient.GetClient(tokenProvider, config.Tenant);

// paging option
var itemsPerPage = 10;
// create unread messages filter
GraphQueryBuilder builder = new GraphQueryBuilder();
builder.IsRead.Equals(false);
var query = builder.GetQuery();

// list messages
var pageInfo = client.ListMessages(KnownFolders.Inbox, new PageInfo(itemsPerPage), query);
var  messages = pageInfo.Items;

while (!pageInfo.LastPage)
{
    pageInfo = client.ListMessages(KnownFolders.Inbox, pageInfo.NextPage, query);
    messages.AddRange(pageInfo.Items);
}

// set messages state as read
foreach (var message in messages)
{
    client.SetRead(message.ItemId);
}

Recupera un messaggio

Recupera il contenuto completo di un messaggio specifico. Il seguente esempio di codice dimostra come recuperare e visualizzare l’ultimo messaggio nella Posta in arrivo per visualizzazione o elaborazione:

  1. Chiama client.ListFolders() per recuperare tutte le cartelle disponibili nella casella di posta e salvarle nella variabile folders.
  2. Itera attraverso ogni cartella nella collezione di cartelle usando un ciclo foreach.
  3. All’interno del ciclo, verifica se il nome visualizzato della cartella è "Inbox".
  4. Se la cartella è la Posta in arrivo, recupera i messaggi usando client.ListMessages() con l’ItemId della cartella.
  5. Verifica se ci sono messaggi nella Posta in arrivo controllando che inboxMessages.Count sia maggiore di 0.
  6. Se ci sono messaggi, recupera il primo messaggio usando client.FetchMessage() con l’ItemId del primo messaggio.
  7. Restituisci il corpo HTML del messaggio recuperato.
var folders = client.ListFolders();

foreach (var folder in folders)
{
    if (folder.DisplayName.Equals("Inbox"))
    {
        // list messages in inbox
        var inboxMessages = client.ListMessages(folder.ItemId);

        if (inboxMessages.Count > 0)
        {
            // fetch the first message in inbox
            var msg = client.FetchMessage(inboxMessages[0].ItemId);
            
            Console.WriteLine(msg.BodyHtml);
        }
        
    }
}

Query Microsoft Graph con OData

Aspose.Email per .NET fornisce supporto alle query OData per Microsoft Graph. Questo consente agli sviluppatori di applicare filtraggio avanzato, ordinamento, selezione, paginazione ed espansione quando si lavora con risorse Graph come cartelle, messaggi, contatti, elementi di calendario e altro. Il Aspose.Email.Clients.Graph.ODataQueryBuilder classe è costruita per creare parametri di query OData in modo strutturato invece di costruire manualmente stringhe di query. In questo modo, puoi recuperare solo i campi necessari (Select) per efficienza, usa il filtraggio (Filter) e l’ordinamento (OrderBy) per organizzare i dati. Puoi anche implementare la paginazione (Top, Skip) per grandi set di dati, espandere entità correlate (Expand) in una chiamata, e attivare il conteggio e la ricerca full-text per scenari avanzati.

Di seguito l’elenco di GraphClient metodi che supportano un opzionale ODataQueryBuilder parametro:**

  • ListFolders
  • ListMessages
  • ListContacts
  • ListCalendarItems
  • ListAttachments
  • ListCategories
  • ListOverrides
  • ListRules
  • ListTaskLists
  • ListTasks
  • ListNotebooks

Il seguente esempio di codice dimostra come usare ODataQueryBuilder per elencare le cartelle e recuperare messaggi email filtrati, ordinati e paginati da una casella di posta:**

var accessParameters = Settings.User1;

var provider = new AzureConfidentialTokenProvider(
    accessParameters.TenantId,
    accessParameters.ClientId,
    accessParameters.ClientSecret);

var client = GraphClient.GetClient(provider, accessParameters.TenantId);

client.Resource = Aspose.Email.Clients.Graph.ResourceType.Users;
client.ResourceId = accessParameters.Username;
client.EndPoint = "https://graph.microsoft.com";

// Example 1: List folders ordered by name
var builder = new ODataQueryBuilder { OrderBy = "name asc" };
var folders = client.ListFolders(builder);

foreach (var folder in folders)
{
    Console.WriteLine(folder.DisplayName);
}

// Example 2: Retrieve filtered and paged messages from Inbox
var folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;

builder = new ODataQueryBuilder
{
    Filter = "startswith(name,'A')",
    OrderBy = "name asc",
    Top = 10,
    Skip = 5,
    Select = new[] { "name", "age" },
    Expand = new[] { "children", "parents" },
    Count = true,
    Search = "\"John Doe\"",
    Format = "json"
};

var msgs = client.ListMessages(folderId, builder);

foreach (var msg in msgs)
{
    Console.WriteLine(msg.Subject);
}

Crea un messaggio

Usa il CreateMessage metodo per salvare un nuovo messaggio direttamente in una cartella specifica, come la Posta in arrivo. Il seguente esempio dimostra come costruire un MapiMessage e aggiungerlo alla casella di posta.

var msg = new MapiMessage(OutlookMessageFormat.Unicode)
{
    Subject = "My message",
    Body = "Hi, it is my message"
};

msg.Recipients.Add("sam@to.com", "Sam", MapiRecipientType.MAPI_TO);

// create message in inbox
client.CreateMessage(KnownFolders.Inbox, msg);

Invia messaggi

Il Invia metodo di IGraphClient ti consente di inviare un messaggio email direttamente usando un MapiMessage oggetto. In questo esempio, viene creato un messaggio semplice, configurato con i dettagli di mittente e destinatario, e poi inviato.

// prepare the message
var msg = new MapiMessage(OutlookMessageFormat.Unicode)
{
    Subject = "My message",
    Body = "Hi, it is my message"
};

msg.Recipients.Add("sam@to.com", "Sam", MapiRecipientType.MAPI_TO);
msg.SetProperty(KnownPropertyList.SenderName, "John");
msg.SetProperty(KnownPropertyList.SentRepresentingEmailAddress, "John@from.com");

// send message
client.Send(msg);

Invia un messaggio Bozza

Puoi salvare un messaggio nella cartella Bozze e inviarlo più tardi usando IGraphClient. Questo approccio ti consente di preparare un messaggio, rivederlo o modificarlo prima dell’invio, e quindi spedirlo quando pronto. Il seguente esempio di codice dimostra come creare una email, aggiungere metadata, salvarla come bozza e poi inviarla:

  1. Crea un MapiMessage con oggetto, corpo e destinatari.
  2. Imposta i dettagli del mittente usando le proprietà del messaggio.
  3. Salva il messaggio nella cartella Bozze usando CreateMessage.
  4. Invia la bozza passando il suo ItemId al Send() metodo.
// prepare the message
var msg = new MapiMessage(OutlookMessageFormat.Unicode)
{
    Subject = "My message",
    Body = "Hi, it is my message"
};

msg.Recipients.Add("sam@to.com", "Sam", MapiRecipientType.MAPI_TO);
msg.SetProperty(KnownPropertyList.SenderName, "John");
msg.SetProperty(KnownPropertyList.SentRepresentingEmailAddress, "John@from.com");

// add message to Draft folder
var draftMessage = client.CreateMessage(KnownFolders.Drafts, msg);

// send a draft message
client.Send(draftMessage.ItemId);

Invia un messaggio EML

Usa il MailMessage classe per creare e inviare messaggi in formato EML. Il seguente esempio di codice dimostra come creare e inviare un messaggio email usando Graph API:

// prepare the message
var eml = new MailMessage
{
    From = "from@domain.com",
    To = "to1@domain.com, to2@domain.com",
    Subject = "New message",
    HtmlBody = "<html><body>This is the HTML body</body></html>"
};

// send the message
graphClient.Send(eml);
graphClient.Create(KnownFolders.Inbox, eml);

Copia messaggi

Per creare un duplicato di un messaggio email esistente, usa il CopiaMessaggio metodo del IGraphClient interfaccia.


// copy message to Inbox folder
var copiedMsg = client.CopyMessage(KnownFolders.Inbox, msg.ItemId);

Sposta messaggi

Per spostare un messaggio email esistente dalla sua posizione attuale a una nuova cartella, usa il MoveMessage metodo del IGraphClient interfaccia.

// move message to Inbox folder
var movedMsg = client.MoveMessage(KnownFolders.Inbox, msg.ItemId);

Gestisci Allegati

Il IGraphClient in Aspose.Email per .NET consente di lavorare con gli allegati email in modo programmatico. Questo include la creazione, il recupero, l’eliminazione e l’elencazione degli allegati associati a un messaggio. Il seguente esempio di codice dimostra la gestione completa del ciclo di vita degli allegati per i messaggi Outlook tramite Microsoft Graph API usando Aspose.Email. È possibile personalizzare il contenuto e i metadati dell’allegato secondo necessità.


// create an attachment
var attachment = new MapiAttachment();
attachment.SetProperty(KnownPropertyList.DisplayName, "My Attachment");
attachment.SetProperty(KnownPropertyList.AttachDataBinary, new byte[1024]);

// add an attachment to message
var createdAttachment = client.CreateAttachment(messageInfo.ItemId, attachment);

// fetch a message attachment
var fetchedAttachment = client.FetchAttachment(createdAttachment.ItemId);

// delete a message attachment 
client.DeleteAttachment(createdAttachment.ItemId);

// list the message attachments
var attachments = client.ListAttachments(messageInfo.ItemId);