[PowerShell] Envoi d’e-mails : Send-MailMessage vs Send-MgUserMail

par | Jan 27, 2026 | Active Directory, Entra ID, PowerShell | 0 commentaires

L’envoi d’e-mails est une fonctionnalité centrale dans de nombreux scripts PowerShell : rapports d’audit, alertes, notifications ou comptes rendus automatisés. Historiquement, la cmdlet Send-MailMessage a longtemps été la solution privilégiée. Avec l’évolution de Microsoft 365 et l’arrivée de Microsoft Graph, de nouvelles approches ont émergé, notamment via Send-MgUserMail.

Ces deux méthodes répondent au même besoin fonctionnel, mais reposent sur des modèles très différents, avec des impacts importants en matière de sécurité, d’authentification et de pérennité.

Send-MailMessage repose sur le protocole SMTP. Il s’agit d’une cmdlet simple à mettre en œuvre, largement utilisée dans les scripts historiques. Elle nécessite toutefois l’accès à un serveur SMTP, souvent avec une authentification basique ou un compte technique.

Avec le durcissement de la sécurité Microsoft 365 et la fin progressive de l’authentification basique, cette méthode devient de plus en plus contraignante. Elle est aujourd’hui marquée comme obsolète par Microsoft et n’est plus recommandée pour de nouveaux développements.

À l’inverse, Send-MgUserMail s’appuie sur Microsoft Graph et fonctionne via des API modernes. L’envoi du message est réalisé au nom d’un utilisateur ou d’une application, en respectant les mécanismes d’authentification modernes (OAuth 2.0).

Cette approche s’intègre naturellement aux environnements Microsoft 365 sécurisés, mais demande une configuration initiale plus structurée, notamment au niveau des permissions Graph.

Envoi d’e-mail via Send-MailMessage (SMTP)

$SmtpParams = @{
    From       = $SmtpFrom
    To         = $SmtpTo
    Cc         = $SmtpCc
    Subject    = $Subject
    Body       = $Body
    BodyAsHtml = $True
    SmtpServer = $SmtpServer
}

Send-MailMessage @SmtpParams -Attachments $FilePath_1, $FilePath_2

Note: le paramètre "Attachments » est là pour rajouter des pièces jointes au mail, ici les arguments représente le chemin du fichier.

Envoi d’e-mail via Send-MgUserMail (Microsoft Graph)

Prérequis:

  • Module Microsoft Graph
  • Utilisateur ou une application autorisée à envoyer des e-mails (Mail.Send)

Deux modèles d’authentification possibles:

Connexion en mode déléguée :

Connect-MgGraph -Scopes "Mail.Send"

Connexion en mode applicative (avec un certificat ou un secret) :

Connect-MgGraph -TenantId "<TenantId>" -ClientId "<AppId>" -CertificateThumbprint "<Thumbprint>"

Une fois la connexion à Graph faite, ci-dessous un template pour envoyer un mail avec un .csv en pièce jointe:

$SmtpFrom = "sender@contoso.com"
$To_Recipients = "mail1@contoso.com", "mail2@contoso.com"
$Cc_Recipients = "mail3@contoso.com", "mail4@contoso.com"
$EmailSubject = "Mail Subject"

# Lit un fichier, le convertit en Base64 et récupère son nom pour une pièce jointe.
$AttachmentContentBytes_1 = [System.IO.File]::ReadAllBytes($FilePath_1)
$AttachmentBase64_1 = [System.Convert]::ToBase64String($AttachmentContentBytes_1)
$AttachmentName_1 = [System.IO.Path]::GetFileName($FilePath_1)

# Formatage nécessaire pour l'envoie à plusieurs destinataire
$To_Recipients_List = @()
foreach ($To_Recipient in $To_Recipients) {
    $To_Recipients_List += @{
        EmailAddress = @{
            Address = $To_Recipient
        }
    }
}

$Cc_Recipients_List = @()
foreach ($Cc_Recipient in $Cc_Recipients) {
    $Cc_Recipients_List += @{
        EmailAddress = @{
            Address = $Cc_Recipient
        }
    }
}

$EmailProperties = @{
    ToRecipients = $To_Recipients_List
    CcRecipients = $Cc_Recipients_List
    Subject      = $EmailSubject
    Body         = @{
        ContentType = "HTML"
        Content     = $Body
    }
    Attachments  = @(
        @{
            "@odata.type" = "#microsoft.graph.fileAttachment"
            Name          = $AttachmentName_1
            ContentBytes  = $AttachmentBase64_1
            ContentType   = "text/csv"
        }
    )
}

Send-MgUserMail -UserId $SmtpFrom -Message $EmailProperties

Note : le paramètre UserId représente la boîte aux lettres émettrice, il faut s’assurer qu’elle existe réellement sinon l’envoie ne fonctionnera pas.

0 commentaires

Soumettre un commentaire

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