15/11/2024

PowerShell

Comment envoyer des e-mails avec PowerShell ? Sans utiliser Send-MailMessage !

I. Présentation

Dans ce tutoriel, nous allons voir qu'il est possible d'envoyer des e-mails avec PowerShell sans utiliser la commande Send-MailMessage car elle est obsolète ! Comment faire alors ? La réponse dans cet article !

Dans la documentation de Microsoft spécifique à la commande Send-MailMessage, on peut lire : "L’applet Send-MailMessage de commande est obsolète. Cette applet de commande ne garantit pas des connexions sécurisées aux serveurs SMTP. Bien qu’il n’existe aucun remplacement immédiat disponible dans PowerShell, nous vous recommandons de ne pas utiliser Send-MailMessage."

Aujourd'hui, la commande Send-MailMessage est toujours opérationnelle avec Windows PowerShell et PowerShell. Bien qu'il n'existe pas de commande officielle pour remplacer celle-ci, il y a tout de même une recommandation de la part de Microsoft : utiliser MailKit.

II. Comment utiliser MailKit avec PowerShell ?

MailKit est une librairie .NET open source qui n'est pas proposée par Microsoft directement, mais elle est maintenue par Jeffrey Stedfast de chez Microsoft. Pour fonctionner, MailKit a besoin de la librairie MimeKit, du même auteur. Puisqu'elles ne sont pas intégrées par défaut à .NET Framework, elles doivent être installées sur votre machine pour permettre d'envoyer des e-mails.

Plutôt que de procéder à l'installation de ces librairies et de construire notre propre fonction d'envoi d'e-mails, nous allons plutôt utiliser le module "Send-MailKitMessage" qui embarque directement ces librairies, en plus de donner accès à une fonction PowerShell pour envoyer des e-mails prête à l'emploi.

Tout d'abord, nous devons installer le module sur notre machine. Ce module est compatible avec PowerShell et Windows PowerShell. Comme le montre l'image ci-dessous, le module intègre bien MailKit et MimeKit.

Module PowerShell avec MailKit et MimeKit

Installation pour l'utilisateur actuel :

Install-Module -Name "Send-MailKitMessage" -Scope CurrentUser

Installation pour tous les utilisateurs de la machine :

Install-Module -Name "Send-MailKitMessage" -Scope AllUsers

Ensuite, il ne reste plus qu'à importer le module :

Import-Module Send-MailKitMessage

III. Envoyer un e-mail avec MailKit

Sur notre machine, nous avons une nouvelle commande prête à l'emploi pour envoyer des e-mails : Send-MailKitMessage ! Comment l'utiliser pour envoyer notre premier e-mail avec PowerShell ? C'est ce que nous allons voir...

Le bout de code ci-dessous permet de définir l'ensemble des variables pour envoyer notre e-mail de façon sécuriser. À la fin, la commande Send-MailKitMessage est exécutée en utilisant l'ensemble des valeurs. Send-MailKitMessage prend en charge le SSL/TLS pour se connecter au serveur SMTP, ainsi que les identifiants (ici via un Get-Credential).

Import-Module Send-MailKitMessage

# SMTP : Serveur
$SMTPServer = "smtp.ionos.fr"

# SMTP : Port
$SMTPPort = 587

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

# SMTP : Destinataire(s)
$SMTPRecipientList = [MimeKit.InternetAddressList]::new()
$SMTPRecipientList.Add([MimeKit.InternetAddress]"[email protected]")

# SMTP : Identifiants
$SMTPCreds = Get-Credential -UserName "[email protected]" -Message "Veuillez saisir le mot de Passe"

# E-mail : objet
$EmailSubject = "E-mail envoyé avec Send-MailKitMessage"

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

# Envoyer l'e-mail
Send-MailKitMessage -SMTPServer $SMTPServer -Port $SMTPPort -From $SMTPSender -RecipientList $SMTPRecipientList `
                    -Subject $EmailSubject -HTMLBody $EmailBody -Credential $SMTPCreds -UseSecureConnectionIfAvailable

Dans l'exemple ci-dessus, le serveur SMTP de chez Ionos est utilisé, mais on peut spécifier celui d'OVHCloud, de Gandi, ou encore de Gmail... Tout dépend de votre fournisseur en fait, mais la logique reste la même. Le paramètre "-HTMLBody" sert à préciser que le corps de l'e-mail est au format HTML, ce qui permet d'ajouter des balises HTML et de personnaliser l'apparence de l'e-mail. Pour un e-mail en mode brut, utilisez le paramètre "-TextBody" à la place.

Lors de l'exécution, il conviendra de saisir le mot de passe (on pourrait aussi l'inclure dans le script directement) puis l'e-mail sera envoyé.

Send-MailKitMessage - Authentification

Voilà, l'e-mail est bien arrivé dans ma boite aux lettres !

PowerShell envoyer e-mail avec MailKit

Pour envoyer l'e-mail à plusieurs personnes (champ "A"), utilisez cette syntaxe :

# SMTP : Destinataire(s)
$SMTPRecipientList = [MimeKit.InternetAddressList]::new()
$SMTPRecipientList.Add([MimeKit.InternetAddress]"[email protected]")
$SMTPRecipientList.Add([MimeKit.InternetAddress]"[email protected]")

Pour Microsoft 365, comment fait-on ? D'autant plus que Microsoft a désactivé l'authentification SMTP basique.

On peut utiliser la fonction d'envoi direct appelée "Direct Send" ou s'appuyer sur l'API Microsoft Graph via PowerShell, mais nous cette seconde méthode dans un prochain article ! Le fait d'utiliser Direct Send permet d'utiliser un SMTP spécifique comme "it-connect-fr.mail.protection.outlook.com" sur le port 25, grâce à la configuration de l'enregistrement SPF du domaine. Voici quelques ressources à ce sujet :

IV. Conclusion

Désormais, vous êtes capable d'envoyer des e-mails en PowerShell sans avoir besoin d'utiliser Send-MailMessage ! Ainsi, vous suivez la recommandation de Microsoft, à savoir ne plus utiliser cette commande et préférer l'utilisation de MailKit. Ceux qui veulent pourront aussi approfondir l'utilisation du framework MailKit pour créer leur propre fonction, mais celle existante et utilisée dans cette démo est déjà très complète.

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

2 commentaires sur “Comment envoyer des e-mails avec PowerShell ? Sans utiliser Send-MailMessage !

  • Top. Superbe article. Bravo.

    PS : « s’appuyer sur l’API Microsoft Graph via PowerShell, mais nous (…) cette seconde méthode dans un prochain article »

    Répondre
  • Durant mes investigations et essais, j’ai découvert une extension à la définition du paramètre SMTPServer :
    « SMTPServer » = [MimeKit.MailboxAddress]::new(« Mon nom convivial », »[email protected] »)
    au lieu de :
    « SMTPServer » = [MimeKit.MailboxAddress] »[email protected] »

    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.