Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo, ampliará la aplicación que creó en Compilación de aplicaciones .NET con Microsoft Graph con las API de correo de Microsoft Graph. Use Microsoft Graph para enumerar la bandeja de entrada del usuario y enviar un correo electrónico.
Bandeja de entrada del usuario de lista
Empiece enumerando los mensajes en la bandeja de entrada de correo electrónico del usuario.
Abra ./GraphHelper.cs y agregue la siguiente función a la clase GraphHelper .
public static Task<MessageCollectionResponse?> GetInboxAsync() { // Ensure client isn't null _ = _userClient ?? throw new System.NullReferenceException("Graph has not been initialized for user auth"); return _userClient.Me // Only messages from Inbox folder .MailFolders["Inbox"] .Messages .GetAsync((config) => { // Only request specific properties config.QueryParameters.Select = new[] { "from", "isRead", "receivedDateTime", "subject" }; // Get at most 25 results config.QueryParameters.Top = 25; // Sort by received time, newest first config.QueryParameters.Orderby = new[] { "receivedDateTime DESC" }; }); }
Reemplace la función vacía
ListInboxAsync
en Program.cs por lo siguiente.async Task ListInboxAsync() { try { var messagePage = await GraphHelper.GetInboxAsync(); if (messagePage?.Value == null) { Console.WriteLine("No results returned."); return; } // Output each message's details foreach (var message in messagePage.Value) { Console.WriteLine($"Message: {message.Subject ?? "NO SUBJECT"}"); Console.WriteLine($" From: {message.From?.EmailAddress?.Name}"); Console.WriteLine($" Status: {(message.IsRead!.Value ? "Read" : "Unread")}"); Console.WriteLine($" Received: {message.ReceivedDateTime?.ToLocalTime().ToString()}"); } // If NextPageRequest is not null, there are more messages // available on the server // Access the next page like: // var nextPageRequest = new MessagesRequestBuilder(messagePage.OdataNextLink, _userClient.RequestAdapter); // var nextPage = await nextPageRequest.GetAsync(); var moreAvailable = !string.IsNullOrEmpty(messagePage.OdataNextLink); Console.WriteLine($"\nMore messages available? {moreAvailable}"); } catch (Exception ex) { Console.WriteLine($"Error getting user's inbox: {ex.Message}"); } }
Ejecute la aplicación, inicie sesión y elija la opción 2 para mostrar la bandeja de entrada.
Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 2 Message: Updates from Ask HR and other communities From: Contoso Demo on Yammer Status: Read Received: 12/30/2021 4:54:54 AM -05:00 Message: Employee Initiative Thoughts From: Patti Fernandez Status: Read Received: 12/28/2021 5:01:10 PM -05:00 Message: Voice Mail (11 seconds) From: Alex Wilber Status: Unread Received: 12/28/2021 5:00:46 PM -05:00 Message: Our Spring Blog Update From: Alex Wilber Status: Unread Received: 12/28/2021 4:49:46 PM -05:00 Message: Atlanta Flight Reservation From: Alex Wilber Status: Unread Received: 12/28/2021 4:35:42 PM -05:00 Message: Atlanta Trip Itinerary - down time From: Alex Wilber Status: Unread Received: 12/28/2021 4:22:04 PM -05:00 ... More messages available? True
Explicación de GetInboxAsync
Tenga en cuenta el código de la GetInboxAsync
función .
Acceso a carpetas de correo conocidas
La función usa el generador de _userClient.Me.MailFolders["Inbox"].Messages
solicitudes, que compila una solicitud para list messages API. Dado que incluye el MailFolders["Inbox"]
generador de solicitudes, la API solo devuelve mensajes en la carpeta de correo solicitada. En este caso, dado que la bandeja de entrada es una carpeta predeterminada y conocida dentro del buzón de un usuario, es accesible a través de su nombre conocido. Se obtiene acceso a las carpetas no predeterminadas de la misma manera, reemplazando el nombre conocido por la propiedad ID de la carpeta de correo. Para obtener más información sobre los nombres de carpeta conocidos disponibles, consulte tipo de recurso mailFolder.
Acceso a una colección
A diferencia de la GetUserAsync
función de la sección anterior, que devuelve un único objeto, este método devuelve una colección de mensajes. La mayoría de las API de Microsoft Graph que devuelven una colección no devuelven todos los resultados disponibles en una única respuesta. En su lugar, usan la paginación para devolver una parte de los resultados al tiempo que proporcionan un método para que los clientes soliciten la página siguiente.
Tamaños de página predeterminados
Las API que usan la paginación implementan un tamaño de página predeterminado. En el caso de los mensajes, el valor predeterminado es 10. Los clientes pueden solicitar más (o menos) mediante el parámetro de consulta $top . En GetInboxAsync
, la adición $top
se realiza con el .Top(25)
método .
Nota:
El valor pasado a .Top()
es un límite superior, no un número explícito. La API devuelve una serie de mensajes hasta el valor especificado.
Obtención de páginas posteriores
Si hay más resultados disponibles en el servidor, las respuestas de colección incluyen una @odata.nextLink
propiedad con una dirección URL de API para acceder a la página siguiente. La biblioteca cliente de .NET proporciona la propiedad en objetos NextPageRequest
de página de colección. Si esta propiedad no es null, hay más resultados disponibles.
La NextPageRequest
propiedad expone un GetAsync
método que devuelve la página siguiente.
Ordenar colecciones
La función usa el OrderBy
método en la solicitud para solicitar resultados ordenados por el momento en que se recibe el mensaje (ReceivedDateTime
propiedad ). Incluye la DESC
palabra clave para que los mensajes recibidos más recientemente aparezcan primero. Este método agrega el parámetro de consulta $orderby a la llamada API.
Enviar correo
Ahora agregue la capacidad de enviar un mensaje de correo electrónico como usuario autenticado.
Abra ./GraphHelper.cs y agregue la siguiente función a la clase GraphHelper .
public static async Task SendMailAsync(string subject, string body, string recipient) { // Ensure client isn't null _ = _userClient ?? throw new System.NullReferenceException("Graph has not been initialized for user auth"); // Create a new message var message = new Message { Subject = subject, Body = new ItemBody { Content = body, ContentType = BodyType.Text }, ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = recipient } } } }; // Send the message await _userClient.Me .SendMail .PostAsync(new SendMailPostRequestBody { Message = message }); }
Reemplace la función vacía
SendMailAsync
en Program.cs por lo siguiente.async Task SendMailAsync() { try { // Send mail to the signed-in user // Get the user for their email address var user = await GraphHelper.GetUserAsync(); var userEmail = user?.Mail ?? user?.UserPrincipalName; if (string.IsNullOrEmpty(userEmail)) { Console.WriteLine("Couldn't get your email address, canceling..."); return; } await GraphHelper.SendMailAsync("Testing Microsoft Graph", "Hello world!", userEmail); Console.WriteLine("Mail sent."); } catch (Exception ex) { Console.WriteLine($"Error sending mail: {ex.Message}"); } }
Ejecute la aplicación, inicie sesión y elija la opción 3 para enviarse un correo electrónico.
Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 3 Mail sent.
Nota:
Si va a realizar pruebas con un inquilino para desarrolladores del Programa para desarrolladores de Microsoft 365, es posible que el correo electrónico que envíe no se entregue y que reciba un informe de no entrega. Si desea desbloquear el envío de correo desde el inquilino, póngase en contacto con el soporte técnico a través de la Centro de administración de Microsoft 365.
Para comprobar que se ha recibido el mensaje, elija la opción 2 para mostrar la bandeja de entrada.
SendMailAsync explicado
Tenga en cuenta el código de la SendMailAsync
función .
Envío de correo
La función usa el generador de _userClient.Me.SendMail
solicitudes, que compila una solicitud a send mail API. El generador de solicitudes toma un Message
objeto que representa el mensaje que se va a enviar.
Creación de objetos
A diferencia de las llamadas anteriores a Microsoft Graph que solo leen datos, esta llamada crea datos. Para crear elementos con la biblioteca cliente, se crea una instancia de la clase que representa los datos (en este caso, Microsoft.Graph.Message
) mediante la new
palabra clave , se establecen las propiedades deseadas y, a continuación, se envían en la llamada API. Dado que la llamada envía datos, se usa el PostAsync
método en lugar de GetAsync
.