Gestionar mensajes de correo electrónico y archivos adjuntos con Microsoft Graph
Aspose.Email IGraphClient proporciona una amplia gama de métodos para gestionar mensajes de correo electrónico y sus archivos adjuntos a través de Microsoft Graph.
Operaciones Disponibles:
-
Listar mensajes
-
Filtrar y paginar mensajes
-
Obtener el contenido del mensaje
-
Crear y enviar mensajes (incluyendo borradores y EML)
-
Copiar y mover mensajes
-
Gestionar archivos adjuntos (crear, obtener, eliminar, listar)
- List messages
- Fetch message
- Create message
- Enviar message
- CopyMessage message
- Move message
- CreateAttachment
- FetchAttachment
- DeleteAttachment
- ListAttachments
Listar mensajes
Para recuperar mensajes de una carpeta como "Inbox", use el ListMessages método.
- Recuperar la lista de carpetas usando client.ListFolders().
- Itere a través de cada carpeta.
- Verifique si el nombre para mostrar de la carpeta es "Inbox".
- Si lo es, liste los mensajes en la bandeja de entrada usando client.ListMessages(folder.ItemId).
- Itere a través de cada mensaje en la bandeja de entrada.
- Imprima el asunto de cada mensaje en la consola.
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);
}
}
}
Listar mensajes de forma asíncrona con Microsoft Graph
El siguiente ejemplo de código muestra cómo acceder a la carpeta Bandeja de entrada, obtener una página de mensajes de correo electrónico con ListMessagesAsync, e imprima sus asuntos:
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);
}
Filtrar mensajes por fecha de envío
El OrderBy El método de la colección de la biblioteca le permite recuperar mensajes con diferentes órdenes de clasificación (ascendente y descendente) basados en la fecha de envío. El siguiente ejemplo de código muestra cómo ordenar los mensajes por su fecha de envío:
-
Inicializar el cliente Graph
- Cree una instancia de IGraphClient usando GraphClient.GetClient() con el proveedor y TenantId.
-
Crear generador de consultas
- Instanciar un GraphQueryBuilder objeto.
-
Ordenar mensajes por fecha en:
-
Orden descendente
- Usar
builder.SentDate.OrderBy(false)para establecer el orden descendente. - Llame a client.ListMessages() para obtener mensajes de la Bandeja de entrada con un límite de 10, usando la consulta de builder.GetQuery().
- Almacene los mensajes recuperados en la variable messages.
- Usar
-
Orden ascendente
- Establezca el orden ascendente llamando a
builder.SentDate.OrderBy(true). - Usar client.ListMessages() nuevamente para obtener mensajes de la Bandeja de entrada, ahora en orden ascendente.
- Almacene estos mensajes en la variable messages.
- Establezca el orden ascendente llamando a
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;
Listar mensajes con paginación y filtrado
Utilice paginación al trabajar con buzones grandes. El ejemplo a continuación recupera mensajes no leídos en páginas de 10 y los marca como leídos después del procesamiento:
- Inicie el cliente.
- Establezca el número de elementos a mostrar por página, por ejemplo, 10.
- Cree un filtro para recuperar solo los mensajes no leídos usando el GraphQueryBuilder clase. El
builder.IsRead.Equals(false)está estableciendo la condición para filtrar mensajes no leídos. - Llame al ListMessages método en el objeto cliente, especificando la carpeta (Inbox) y los elementos por página (PageInfo(itemsPerPage)) como parámetros. También pasa el objeto de consulta para aplicar el filtro de mensajes no leídos. El objeto PageInfo devuelto (pageInfo) contiene los mensajes recuperados para la página actual en la propiedad Items.
- Cree un bucle que continúe hasta que se alcance la última página (pageInfo.LastPage es false). Los mensajes recuperados se añaden a la lista de mensajes existentes 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);
}
Obtener un mensaje
Recuperar el contenido completo de un mensaje específico. El siguiente ejemplo de código muestra cómo recuperar y mostrar el último mensaje en la Bandeja de entrada para su visualización o procesamiento:
- Llame a client.ListFolders() para recuperar todas las carpetas disponibles en el buzón y almacenarlas en la variable folders.
- Itere a través de cada carpeta en la colección de carpetas usando un bucle foreach.
- Dentro del bucle, verifique si el nombre para mostrar de la carpeta es "Inbox".
- Si la carpeta es la Bandeja de entrada, recupere los mensajes usando client.ListMessages() con el ItemId de la carpeta.
- Verifique si hay mensajes en la bandeja de entrada comprobando que inboxMessages.Count sea mayor que 0.
- Si hay mensajes, obtenga el primer mensaje usando client.FetchMessage() con el ItemId del primer mensaje.
- Salida del cuerpo HTML del mensaje obtenido.
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);
}
}
}
Consultas Microsoft Graph con OData
Aspose.Email para .NET proporciona soporte de consultas OData para Microsoft Graph. Esto permite a los desarrolladores aplicar filtrado avanzado, ordenamiento, selección, paginación y expansión al trabajar con recursos de Graph como carpetas, mensajes, contactos, elementos de calendario y más. El Aspose.Email.Clients.Graph.ODataQueryBuilder clase está construida para crear parámetros de consulta OData de forma estructurada en lugar de construir manualmente cadenas de consulta. De esta manera, puede recuperar solo los campos necesarios (Select) para eficiencia, usar filtrado (Filter) y ordenamiento (OrderBy) para organizar datos. También puede implementar paginación (Top, Skip) para conjuntos de datos grandes, expandir entidades relacionadas (Expand) en una sola llamada, y habilitar el conteo y la búsqueda de texto completo para escenarios avanzados.
A continuación se muestra la lista de GraphClient métodos que admiten un ** opcionalODataQueryBuilder** parámetro:
ListFoldersListMessagesListContactsListCalendarItemsListAttachmentsListCategoriesListOverridesListRulesListTaskListsListTasksListNotebooks
El siguiente ejemplo de código muestra cómo usar ODataQueryBuilder para listar carpetas y recuperar mensajes de correo electrónico filtrados, ordenados y paginados de un buzón:**
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);
}
Crear un mensaje
Utilice el CreateMessage método para guardar un mensaje nuevo directamente en una carpeta específica, como la Bandeja de entrada. El siguiente ejemplo muestra cómo construir un MapiMessage y añadirlo al buzón.
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);
Enviar mensajes
El Enviar método de IGraphClient le permite enviar un mensaje de correo electrónico directamente usando un MapiMessage objeto. En este ejemplo, se crea un mensaje simple, configurado con los detalles del remitente y del destinatario, y luego se envía.
// 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);
Enviar un mensaje borrador
Puede guardar un mensaje en la carpeta Borradores y enviarlo más tarde usando IGraphClient. Este enfoque le permite preparar un mensaje, revisarlo o modificarlo antes de enviarlo, y luego despacharlo cuando esté listo. El siguiente ejemplo de código muestra cómo crear un correo electrónico, agregar metadatos, guardarlo como borrador y luego enviarlo:
- Cree un MapiMessage con asunto, cuerpo y destinatarios.
- Establezca los detalles del remitente usando las propiedades del mensaje.
- Guarde el mensaje en la carpeta Borradores usando CreateMessage.
- Envíe el borrador pasando su ItemId al Send() método.
// 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);
Enviar un mensaje EML
Utilice el MailMessage clase para crear y enviar mensajes con formato EML. El siguiente ejemplo de código muestra cómo crear y enviar un mensaje de correo electrónico usando la API Graph:
// 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);
Copiar mensajes
Para crear un duplicado de un mensaje de correo electrónico existente, use el CopyMessage método del IGraphClient interfaz.
// copy message to Inbox folder
var copiedMsg = client.CopyMessage(KnownFolders.Inbox, msg.ItemId);
Mover mensajes
Para mover un mensaje de correo electrónico existente de su ubicación actual a una nueva carpeta, use el MoveMessage método del IGraphClient interfaz.
// move message to Inbox folder
var movedMsg = client.MoveMessage(KnownFolders.Inbox, msg.ItemId);
Gestionar archivos adjuntos
El IGraphClient en Aspose.Email para .NET le permite trabajar con archivos adjuntos de correo electrónico de forma programática. Esto incluye crear, recuperar, eliminar y enumerar los archivos adjuntos asociados a un mensaje. El siguiente ejemplo de código demuestra la gestión completa del ciclo de vida de los adjuntos para mensajes de Outlook a través de la API Microsoft Graph usando Aspose.Email. Puede personalizar el contenido y los metadatos del adjunto según sea necesario.
// 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);