Compartir a través de


Adición de funcionalidades de correo electrónico a aplicaciones de Go con Microsoft Graph

En este artículo, ampliará la aplicación que creó en Aplicaciones de Build Go 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.

  1. Agregue la siguiente función a ./graphhelper/graphhelper.go.

    func (g *GraphHelper) GetInbox() (models.MessageCollectionResponseable, error) {
        var topValue int32 = 25
        query := users.ItemMailFoldersItemMessagesRequestBuilderGetQueryParameters{
            // Only request specific properties
            Select: []string{"from", "isRead", "receivedDateTime", "subject"},
            // Get at most 25 results
            Top: &topValue,
            // Sort by received time, newest first
            Orderby: []string{"receivedDateTime DESC"},
        }
    
        return g.userClient.Me().MailFolders().
            ByMailFolderId("inbox").
            Messages().
            Get(context.Background(),
                &users.ItemMailFoldersItemMessagesRequestBuilderGetRequestConfiguration{
                    QueryParameters: &query,
                })
    }
    
  2. Reemplace la función vacía listInbox en graphtutorial.go por lo siguiente.

    func listInbox(graphHelper *graphhelper.GraphHelper) {
        messages, err := graphHelper.GetInbox()
        if err != nil {
            log.Panicf("Error getting user's inbox: %v", err)
        }
    
        // Load local time zone
        // Dates returned by Graph are in UTC, use this
        // to convert to local
        location, err := time.LoadLocation("Local")
        if err != nil {
            log.Panicf("Error getting local timezone: %v", err)
        }
    
        // Output each message's details
        for _, message := range messages.GetValue() {
            fmt.Printf("Message: %s\n", *message.GetSubject())
            fmt.Printf("  From: %s\n", *message.GetFrom().GetEmailAddress().GetName())
    
            status := "Unknown"
            if *message.GetIsRead() {
                status = "Read"
            } else {
                status = "Unread"
            }
            fmt.Printf("  Status: %s\n", status)
            fmt.Printf("  Received: %s\n", (*message.GetReceivedDateTime()).In(location))
        }
    
        // If GetOdataNextLink does not return nil,
        // there are more messages available on the server
        nextLink := messages.GetOdataNextLink()
    
        fmt.Println()
        fmt.Printf("More messages available? %t\n", nextLink != nil)
        fmt.Println()
    }
    
  3. 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: 2021-12-30 04:54:54 -0500 EST
    Message: Employee Initiative Thoughts
      From: Patti Fernandez
      Status: Read
      Received: 2021-12-28 17:01:10 -0500 EST
    Message: Voice Mail (11 seconds)
      From: Alex Wilber
      Status: Unread
      Received: 2021-12-28 17:00:46 -0500 EST
    Message: Our Spring Blog Update
      From: Alex Wilber
      Status: Unread
      Received: 2021-12-28 16:49:46 -0500 EST
    Message: Atlanta Flight Reservation
      From: Alex Wilber
      Status: Unread
      Received: 2021-12-28 16:35:42 -0500 EST
    Message: Atlanta Trip Itinerary - down time
      From: Alex Wilber
      Status: Unread
      Received: 2021-12-28 16:22:04 -0500 EST
    
    ...
    
    More messages available? True
    

GetInbox explicado

Tenga en cuenta el código de la GetInbox función .

Acceso a carpetas de correo conocidas

La función usa el generador de userClient.Me().MailFolders.ByMailFolderId("inbox").Messages() solicitudes, que compila una solicitud para list messages API. Dado que incluye el ByMailFolderId("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 GetUser 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 GetInbox, la adición $top se realiza con la Top propiedad en los parámetros de consulta.

Nota:

El valor pasado en 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. El SDK de Go proporciona el GetOdataNextLink método en objetos de página de colección. Si este método devuelve valores no nulos, hay más resultados disponibles.

Ordenar colecciones

La función usa la OrderBy propiedad en los parámetros de consulta 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. La OrderBy propiedad 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.

  1. Agregue la siguiente función a ./graphhelper/graphhelper.go.

    func (g *GraphHelper) SendMail(subject *string, body *string, recipient *string) error {
        // Create a new message
        message := models.NewMessage()
        message.SetSubject(subject)
    
        messageBody := models.NewItemBody()
        messageBody.SetContent(body)
        contentType := models.TEXT_BODYTYPE
        messageBody.SetContentType(&contentType)
        message.SetBody(messageBody)
    
        toRecipient := models.NewRecipient()
        emailAddress := models.NewEmailAddress()
        emailAddress.SetAddress(recipient)
        toRecipient.SetEmailAddress(emailAddress)
        message.SetToRecipients([]models.Recipientable{
            toRecipient,
        })
    
        sendMailBody := users.NewItemSendMailPostRequestBody()
        sendMailBody.SetMessage(message)
    
        // Send the message
        return g.userClient.Me().SendMail().Post(context.Background(), sendMailBody, nil)
    }
    
  2. Reemplace la función vacía sendMail en graphtutorial.go por lo siguiente.

    func sendMail(graphHelper *graphhelper.GraphHelper) {
        // Send mail to the signed-in user
        // Get the user for their email address
        user, err := graphHelper.GetUser()
        if err != nil {
            log.Panicf("Error getting user: %v", err)
        }
    
        // For Work/school accounts, email is in Mail property
        // Personal accounts, email is in UserPrincipalName
        email := user.GetMail()
        if email == nil {
            email = user.GetUserPrincipalName()
        }
    
        subject := "Testing Microsoft Graph"
        body := "Hello world!"
        err = graphHelper.SendMail(&subject, &body, email)
        if err != nil {
            log.Panicf("Error sending mail: %v", err)
        }
    
        fmt.Println("Mail sent.")
        fmt.Println()
    }
    
  3. 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.

  4. Para comprobar que se ha recibido el mensaje, elija la opción 2 para mostrar la bandeja de entrada.

SendMail explicado

Tenga en cuenta el código de la SendMail 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, cree una instancia de la clase que represente los datos (en este caso, models.Message), establezca las propiedades deseadas y envíelas en la llamada API. Dado que la llamada envía datos, se usa el Post método en lugar de Get.

Paso siguiente