Partager via


Ajouter des fonctionnalités de messagerie aux applications Go à l’aide de Microsoft Graph

Dans cet article, vous allez étendre l’application que vous avez créée dans Générer des applications Go avec Microsoft Graph avec les API de messagerie Microsoft Graph. Vous utilisez Microsoft Graph pour répertorier la boîte de réception de l’utilisateur et envoyer un e-mail.

Lister la boîte de réception de l’utilisateur

Commencez par répertorier les messages dans la boîte de réception de l’utilisateur.

  1. Ajoutez la fonction suivante à ./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. Remplacez la fonction vide listInbox dans graphtutorial.go par ce qui suit.

    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. Exécutez l’application, connectez-vous et choisissez l’option 2 pour répertorier votre boîte de réception.

    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
    

Explication de GetInbox

Considérez le code dans la GetInbox fonction .

Accès aux dossiers de courrier connus

La fonction utilise le générateur de userClient.Me().MailFolders.ByMailFolderId("inbox").Messages() requêtes, qui génère une requête à l’API Répertorier les messages . Étant donné qu’elle inclut le ByMailFolderId("inbox") générateur de demandes, l’API retourne uniquement les messages dans le dossier de courrier demandé. Dans ce cas, étant donné que la boîte de réception est un dossier par défaut connu dans la boîte aux lettres d’un utilisateur, elle est accessible via son nom connu. Les dossiers non définis par défaut sont accessibles de la même façon, en remplaçant le nom connu par la propriété ID du dossier de messagerie. Pour plus d’informations sur les noms de dossiers connus disponibles, consultez Type de ressource mailFolder.

Accès à une collection

Contrairement à la GetUser fonction de la section précédente, qui retourne un seul objet, cette méthode retourne une collection de messages. La plupart des API de Microsoft Graph qui retournent une collection ne retournent pas tous les résultats disponibles dans une seule réponse. Au lieu de cela, ils utilisent la pagination pour retourner une partie des résultats tout en fournissant une méthode permettant aux clients de demander la page suivante.

Tailles de page par défaut

Les API qui utilisent la pagination implémentent une taille de page par défaut. Pour les messages, la valeur par défaut est 10. Les clients peuvent demander plus (ou moins) à l’aide du paramètre de requête $top . Dans GetInbox, l’ajout $top s’effectue avec la Top propriété dans les paramètres de requête.

Remarque

La valeur passée Top est une limite supérieure, et non un nombre explicite. L’API retourne un certain nombre de messages jusqu’à la valeur spécifiée.

Obtention des pages suivantes

Si d’autres résultats sont disponibles sur le serveur, les réponses de regroupement incluent une @odata.nextLink propriété avec une URL d’API pour accéder à la page suivante. Le Kit de développement logiciel (SDK) Go fournit la méthode sur les GetOdataNextLink objets de page de collection. Si cette méthode retourne une valeur non nulle, d’autres résultats sont disponibles.

Tri des collections

La fonction utilise la OrderBy propriété dans les paramètres de requête pour demander des résultats triés en fonction de la réception du message (receivedDateTime propriété ). Il inclut les DESC mot clé afin que les messages reçus plus récemment soient répertoriés en premier. La OrderBy propriété ajoute le paramètre de requête $orderby à l’appel d’API.

Envoyer un message

Ajoutez maintenant la possibilité d’envoyer un e-mail en tant qu’utilisateur authentifié.

  1. Ajoutez la fonction suivante à ./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. Remplacez la fonction vide sendMail dans graphtutorial.go par ce qui suit.

    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. Exécutez l’application, connectez-vous et choisissez l’option 3 pour vous envoyer un e-mail.

    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.
    

    Remarque

    Si vous effectuez des tests auprès d’un locataire développeur dans le cadre du Programme pour développeurs Microsoft 365, l’e-mail que vous envoyez risque de ne pas être remis et vous recevrez peut-être un rapport de non-remise. Si vous souhaitez débloquer l’envoi de courrier de votre locataire, contactez le support via le Centre d’administration Microsoft 365.

  4. Pour vérifier que le message a été reçu, choisissez l’option 2 pour répertorier votre boîte de réception.

SendMail expliqué

Considérez le code dans la SendMail fonction .

Envoi de messages

La fonction utilise le générateur de userClient.Me().SendMail() requêtes, qui génère une requête à l’API Envoyer un courrier . Le générateur de requêtes prend un Message objet représentant le message à envoyer.

Création d’objets

Contrairement aux appels précédents à Microsoft Graph qui ne lisent que les données, cet appel crée des données. Pour créer des éléments avec la bibliothèque cliente, créez une instance de la classe représentant les données (dans ce cas, models.Message), définissez les propriétés souhaitées, puis envoyez-la dans l’appel d’API. Étant donné que l’appel envoie des données, la Post méthode est utilisée à la place de Get.

Étape suivante