17/11/2024

PowerShell

PowerShell et Microsoft Graph : comment envoyer des e-mails avec Send-MgUserMail ?

I. Présentation

Dans ce tutoriel, nous allons utiliser PowerShell pour envoyer un e-mail avec la commande Send-MgUserMail de Microsoft Graph ! Cette commande représente une alternative à Send-MailMessage qui est considérée comme obsolète. Précédemment, nous avions vu comment utiliser MailKit pour envoyer des e-mails avec PowerShell (avec différents fournisseurs).

Si vous débutez avec Microsoft Graph, je vous recommande de lire les deux articles ci-dessous. Ils répondront surement à bon nombre de questions que vous pourriez vous poser !

II. Installer le module Microsoft Graph

Commençons par installer le module Microsoft Graph pour l'utilisateur actuel :

Install-Module Microsoft.Graph -Scope CurrentUser

Vous pouvez aussi l'installer pour tous les utilisateurs :

Install-Module Microsoft.Graph -Scope AllUsers

III. Application Microsoft Graph et l'autorisation Mail.Send

La seconde étape consiste à inscrire une nouvelle application sur votre tenant, à partir du portail Azure Active Directory (point d'entrée portal.azure.com).

Dans Azure Active Directory, cliquez sur "Inscriptions d'applications" à gauche puis sur le bouton "Nouvelle inscription".

Azure AD : inscription d'une nouvelle application
Azure AD : inscription d'une nouvelle application

Donnez un nom à cette application, par exemple "Script-PowerShell-Graph". Conserver l'option "Comptes dans cet annuaire d'organisation uniquement" pour l'option "Types de comptes pris en charge" et pour l'URI de redirection, laissez vide.

Cliquez sur le bouton "S'inscrire".

L'application est inscrite. Il y a deux informations qu'il faudra récupérer par la suite, car nous en aurons besoin lors de la connexion avec PowerShell : ID d'applications (client) et ID de l'annuaire (locataire).

Au sein de notre application, cliquez sur "API autorisées" à gauche puis au centre sur "Ajouter une autorisation" car nous devons donner l'autorisation à cette application pour qu'elle puisse utiliser le point d'entrée "Mail.Send".

Sélectionnez "Microsoft Graph" puis à l'étape suivante choisissez "Autorisations d'application".

Recherchez "mail.send" dans la zone de recherche, et cochez "Mail.Send" avant de valider. Cette autorisation permet d'envoyer un e-mail en tant que n'importe quel utilisateur !

Microsoft Graph - Mail.Send - Permission

L'autorisation vient s'ajouter à celle présente par défaut. Il reste à cliquer sur le bouton "Accorder un consentement d'administrateur pour Default Directory".

Accorder consentement Graph API pour e-mail

Les feux sont au vert. Vous devez obtenir ceci :

Accorder consentement Graph API pour e-mail - OK

L'application Microsoft Graph pour PowerShell est prête ! Avec cette application, on a seulement l'autorisation d'envoyer des e-mails.

IV. Se connecter à Microsoft Graph avec un ClientSecretCredential

À partir de PowerShell, nous devons établir une connexion à Microsoft Graph grâce à l'application créée et configurée précédemment. Pour cela, on va commencer par définir trois variables :

# ID du tenant
$IDTenant = "806d3d28..."

# ID de l'application
$IDApp = "a8615473-....."

# Secret
$Secret = "<secret récupéré sur Azure>"

Vous disposez déjà de l'ID du tenant et de l'ID de l'application (informations récupérables dans la vue d'ensemble de l'application).

Pour le secret, que doit-on mettre ? Ceci va permettre de s'authentifier avec un secret (renouvelable) plutôt qu'avec un certificat. Ceci rend l'authentification transparente, ce qui est idéal pour un script qui doit tourner en tâche planifiée, par exemple.

À partir du portail Azure, dans l'application, cliquez sur "Certificats & secrets" à gauche, puis sur l'onglet "Secrets client" afin de cliquer sur "Nouveau secret client". Sur la droite, on va vous demander une description et une date d'expiration. La valeur recommandée par Microsoft est 6 mois, mais c'est personnalisable.

Cliquez sur "Ajouter" : votre secret sera visible !

Secrets client pour Microsoft Graph PowerShell

Vous devez copier la valeur et l'utiliser pour la variable $Secret :

# Secret
$Secret = "LT18Q...."

Il ne reste plus qu'à utiliser ces trois informations pour établir la connexion à Microsoft Graph :

$SecureSecret = ConvertTo-SecureString -AsPlainText $Secret -Force
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($IDApp, $SecureSecret)
Connect-MgGraph -TenantId $IDTenant -ClientSecretCredential $ClientSecretCredential

Si la connexion est réussie, le message de bienvenue s'affiche !

Welcome to Microsoft Graph!

Si vous préférez utiliser le mode interactif afin que le secret soit demandé (il faudra le copier-coller pour valider la connexion), utilisez cette syntaxe :

$ClientCredential = Get-Credential -Username $IDApp -Message "Indiquez le secret"
Connect-MgGraph -TenantId $IDTenant -ClientSecretCredential $ClientCredential

La connexion est établie, passons à la suite !

V. Envoyer un e-mail avec Send-MgUserMail

Le module est installé. L'application est prête sur notre tenant. Dernière étape à réaliser : envoyer un e-mail avec Send-MgUserMail !

Commençons par définir un ensemble de variables pour préciser le serveur SMTP, le numéro de port, l'objet de l'e-mail, l'expéditeur, etc... Il est à noter que l'expéditeur doit exister sur votre tenant ! Vous ne pouvez pas mettre n'importe quoi.

# SMTP : Serveur
$SMTPServer = "smtp.office365.com"

# SMTP : Port
$SMTPPort = 587

# SMTP : Expéditeur
$SMTPSender = "[email protected]"

# E-mail : objet
$EmailSubject = "E-mail envoyé avec Microsoft Graph"

# E-mail : corps
$EmailBody = "<h1>Démo Microsoft Graph</h1>"

# SMTP : Destinataire(s)
$SMTPRecipient = "[email protected]"

$SMTPRecipientList = @()
$SMTPRecipientList += @{
      EmailAddress = @{
         Address = $SMTPRecipient
   }
}

Puis, on détermine les propriétés de notre e-mail, à l'aide des valeurs définies ci-dessus.

$EmailProperties = @{
   ToRecipients = $SMTPRecipientList
   Subject = $EmailSubject
   Body = @{
      ContentType = "HTML"
      Content = $EmailBody
   }
}

Il ne reste plus qu'à envoyer l'e-mail avec Send-MgUserMail ! Ce qui donne :

Send-MgUserMail -UserId $SMTPSender -Message $EmailProperties

Quelques secondes plus tard, j'ai bien reçu l'e-mail dans ma boite aux lettres !

E-mail envoyé avec PowerShell et Microsoft Graph

Une fois les e-mails envoyés, pensez à vous déconnecter de Microsoft Graph :

Disconnect-MgGraph

VI. Conclusion

Désormais, vous êtes capable d'envoyer un e-mail en PowerShell en passant par Microsoft 365 et l'API Microsoft Graph ! Cet e-mail est envoyé de manière sécurisée, sans avoir besoin d'exposer les identifiants d'un utilisateur et avec des droits limités. Si vous avez besoin d'envoyer un e-mail en utilisant un autre service que Microsoft 365, pensez à regarder mon article basé sur PowerShell et MailKit (lien en introduction).

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

4 commentaires sur “PowerShell et Microsoft Graph : comment envoyer des e-mails avec Send-MgUserMail ?

  • Bonjour,
    Article bien détaillé. Je rajouterai la possibilité de vérouiller un peu la chose en ajoutant des ApplicationAccessPolicy qui limitent les boites qui peuvent utiliser l’App Azure afin de ne pas ouvrir trop grand
    Cordialement

    Répondre
  • Bonjour
    J’ai testé vos commande et la connexion à Microsoft graph fonctionne bien mais l’envoi d’email aprés avoir remplacé l’expéditeur et le destinataire par deux adresses de mon tenant renvoie une erreur:
    Send-MgUserMail -UserId $SMTPSender -Message $EmailProperties
    | ~
    | Missing ‘=’ operator after key in hash literal

    Répondre
  • Bonjour, j’ai trouvé l’erreur, juste une parenthese mal fermée, le script a parfaiement fonctionné
    merci!

    Répondre
  • Bonjour
    cela fonctionne parfaitement bien.
    cependant, pourriez vous me dire comment intégrer plusieurs pièce jointe au mail.?

    j’ai fait quelque recherche sur internet mais je ne suis pas un pro du powershall.

    d’avance Merci

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.