- PowerShell Il vous permet d'envoyer des e-mails avec Send-MailMessage ou SmtpClient, idéal pour les scripts et les tâches planifiées.
- La cmdlet Send-MailMessage est obsolète et de nombreux fournisseurs bloquent l'authentification SMTP de base.
- Outlook.com et Office 365 nécessitent une authentification moderne, vous devez donc utiliser Graph ou d'autres serveurs SMTP.
- Pour automatiser les notifications par e-mail, il est conseillé d'utiliser un serveur SMTP contrôlé ou des services conçus pour l'automatisation.
Automatisez les e-mails depuis terminal C'est l'un des moyens les plus simples de configurer des notifications, des alertes ou de petits systèmes de reporting sans investir dans des outils complexes. Linux avec Bash comme dans Fenêtres Avec PowerShell, vous pouvez envoyer emails journaux d'état du système, journaux des tâches planifiées ou de toute information que vous pouvez générer avec un scénario.
L'essentiel est de bien comprendre Comment communiquer avec un serveur SMTP (Celui qui envoie réellement l'e-mail) et les limitations imposées aujourd'hui par des fournisseurs comme Outlook.com, Office 365 ou Gmail, notamment depuis qu'ils ont abandonné l'authentification de base par nom d'utilisateur et mot de passe. Vous trouverez ci-dessous une compilation regroupant et réorganisant les meilleurs guides disponibles en ligne, présentés différemment et avec une approche plus pratique et actuelle.
Envoi d'e-mails depuis PowerShell : options classiques et modernes
PowerShell permet l'envoi de courriels de manière native depuis de nombreuses années.soit en utilisant l'applet de commande Send-MailMessage ou directement la classe System.Net.Mail.SmtpClientLes deux approches restent fonctionnelles dans de nombreux scénarios sur site, bien que Microsoft ait déjà marqué les esprits. Send-MailMessage Il est considéré comme obsolète et son utilisation est déconseillée avec les serveurs externes modernes, notamment sur Internet.
Avant d'entrer dans les détails, il est important de comprendre que Vous aurez toujours besoin d'un serveur SMTP.Il peut s'agir du serveur de votre entreprise, de celui de votre fournisseur de messagerie ou même d'un serveur de test local. Sans lui, aucune commande PowerShell ne pourra envoyer de message, car PowerShell se contente de préparer le message et de le transmettre à ce serveur.
Dans des environnements contrôlés (laboratoires, intranets, serveurs internes) Il reste judicieux d'utiliser des méthodes anciennes et simples ; cependant, pour Outlook.com, Exchange Online ou d'autres services importants, l'envoi d'un nom d'utilisateur et d'un mot de passe ne suffit plus : il faut recourir à OAuth2, aux jetons d'application ou à des solutions spécifiques comme Microsoft Graph.
Comment fonctionne en interne la commande Send-MailMessage
L'applet de commande Send-MailMessage Il a été conçu pour simplifier au maximum l'envoi d'e-mails à partir de scripts. Sa syntaxe prend en charge une multitude de paramètres permettant de contrôler tous les aspects, des destinataires à la mise en forme du corps du message en passant par sa priorité.
La manière la plus courante de le visualiser est avec des paramètres individuels, mais en interne, il accepte des ensembles de paramètres beaucoup plus importants, notamment informations d'identification d'authentification, ports personnalisés et utilisation de SSL/TLSLa syntaxe générale est longue, mais on peut la résumer ainsi :
Send-MailMessage -From <remitente> -To <destinatarios> -Subject <asunto> -Body <cuerpo> -SmtpServer <servidor SMTP> ...
Les paramètres minimaux que vous utiliserez presque toujours sont:
- DèsAdresse e-mail de l'expéditeur. Vous pouvez inclure un nom descriptif, par exemple :
"Admin <[email protected]>". - À: un ou plusieurs destinataires, au format adresse ou avec nom et adresse.
- Sujet: objet du courriel.
- Body: le contenu du message, qu'il s'agisse de texte brut ou de HTML.
- Serveur SMTP: nom ou adresse IP du serveur SMTP auquel PowerShell se connectera.
- Port: Port SMTP (généralement 25 sans chiffrement sur le réseau local, ou 587 avec TLS STARTTLS).
Lorsque le serveur exige une authentification, ce qui est pratiquement toujours le cas de nos jours, Vous devez ajouter le paramètre -Credential avec un objet PSCredentialDe plus, si le serveur requiert un chiffrement, celui-ci doit être activé. -UseSsl afin que l'applet de commande puisse négocier une connexion TLS sécurisée.
Exemples pratiques avec Send-MailMessage
Un exemple très typique est l'envoi d'un simple courriel entre deux utilisateurs de la même organisation, en utilisant le serveur SMTP défini dans $PSEmailServer (Variable globale PowerShell pour le protocole SMTP par défaut) :
$parametros = @{
From = 'User01 <[email protected]>'
To = 'User02 <[email protected]>'
Subject = 'Correo de prueba'
}
Send-MailMessage @parametros
Dans ce cas, Cela n'arrive pas -BodyLe texte de l'objet sert donc de contenu à l'e-mail. C'est un moyen rapide d'envoyer des alertes brèves sans s'encombrer de plusieurs lignes de texte.
Si ce que vous voulez, c'est envoyer un fichier jointPar exemple, pour un fichier CSV généré par un autre script, vous pouvez procéder presque aussi facilement en ajoutant le paramètre -Attachments et d'autres détails tels que le niveau de priorité ou les demandes de notification de livraison :
$parametros = @{
From = 'User01 <[email protected]>'
To = 'User02 <[email protected]>', 'User03 <[email protected]>'
Subject = 'Envío de adjunto'
Body = "Te envío el adjunto que faltaba."
Attachments = '.\datos.csv'
Priority = 'High'
DeliveryNotificationOption = 'OnSuccess','OnFailure'
SmtpServer = 'smtp.fabrikam.com'
}
Send-MailMessage @parametros
Notifications de haute priorité et de succès ou d'échec Ils peuvent s'avérer très utiles dans les scripts critiques. En cas de problème lors de la livraison du message, celui-ci sera transféré vers le compte de l'expéditeur.
Vous pouvez aussi jouer avec Différences entre CC et CCO (Cci) pour les listes de diffusion, ou utilisez -BodyAsHtml Si vous souhaitez envoyer un rapport au format HTML (tableaux, couleurs, etc.), sachez qu'en entreprise, il est courant de l'utiliser pour les notifications de sauvegarde, l'état des serveurs ou les résumés quotidiens des journaux.
Paramètres avancés : copies, encodage, réponses, etc.
Cette cmdlet est beaucoup plus complète qu'il n'y paraît au premier abord. paramètres intéressants Voici quelques points importants à retenir :
- -Cc et -Bcc: permettre l'ajout de destinataires en copie carbone et en copie carbone invisible en utilisant le même format que
-ToIl est utile, par exemple, d'envoyer une notification à un groupe de soutien et de laisser le nom du responsable dans le champ CCI. - -BodyAsHtml: indique que le contenu de
-BodyIl est au format HTML. Idéal pour les rapports attrayants générés par des scripts (par exemple, les résultats d'un inventaire de matériel sous forme de tableau). - -Pièces jointes: accepte un ou plusieurs chemins d'accès à des fichiers existants. Vous pouvez rediriger les chemins d'accès sortants vers d'autres fichiers. commandes ce paramètre permet d'automatiser les rapports.
- -Option de notification de livraison: vous permet de choisir si vous souhaitez recevoir des notifications de livraison
OnSuccess,OnFailure,Delay,Neverou aucun (None). - -Codage: définit l'encodage utilisé pour envoyer le contenu du message. L'UTF-8 sans BOM est utilisé par défaut dans les versions récentes, mais vous pouvez le spécifier.
ASCII,Unicode, codes de page spécifiques, etc. - -Répondre à: permet de définir des adresses différentes pour
Fromafin que les réponses du destinataire soient acheminées vers un autre emplacement. - -Je porte: Modifiez le port SMTP (généralement 25, 587 ou 465 en fonction du serveur et du type de connexion).
- -UtiliserSsl: force l'établissement de la session SMTP via SSL/TLS, ce qui est essentiel avec la plupart des fournisseurs externes.
Tous ces paramètres sont librement combinables. en une seule soumission, vous pouvez donc affiner le comportement sans quitter l'applet de commande elle-même ni écrire trop de lignes de code.
Obsolescence de Send-MailMessage et alternatives recommandées
Microsoft a marqué Send-MailMessage en tant que cmdlet obsolète (Note de compatibilité DE0005). La principale raison est qu'il ne garantit pas à lui seul des connexions sécurisées et ne prend pas correctement en charge les exigences d'authentification modernes requises par de nombreux serveurs actuels, notamment dans le cloud.
Dans sa documentation officielle, Microsoft suggère que pour les scénarios nécessitant une sécurité complète et une compatibilité avec TLS et l'authentification moderne, vous devriez utiliser bibliothèques externes telles que MailKit (très puissant pour SMTP, IMAP et POP3) ou, dans le cas spécifique d'Exchange Online et d'Outlook dans le cloud, à l'applet de commande Send-MgUserMail du kit de développement logiciel (SDK) Microsoft Graph pour PowerShell.
Cela signifie-t-il que Envoyer-Message Cela cessera-t-il de fonctionner ? Pas nécessairement. Cela continuera de fonctionner sur de nombreux serveurs SMTP classiques, notamment au sein des réseaux internes ou sur les serveurs configurés pour autoriser une authentification simple. En revanche, cela deviendra de moins en moins viable face aux grands services comme Outlook.com, Office 365 ou Gmail, où l’authentification de base a été désactivée.
Problèmes courants lors de l'envoi d'e-mails avec PowerShell et Outlook.com / Office 365
L'un des cas les plus fréquents dans la vie réelle aujourd'hui est celui d'une personne qui a utilisé un simple script avec System.Net.Mail.SmtpClient contra smtp.office365.com et soudain, le script cesse de fonctionner avec des messages d'erreur liés à l'authentification sécurisée, tels que ceux décrits dans Problèmes Outlook sous Windows 10.
Un exemple très représentatif Il s'agit de celui d'un utilisateur avec un compte Outlook.com gratuit qui utilisait quelque chose comme ceci dans PowerShell :
$EmailFrom = '[email protected]'
$EmailTo = '[email protected]'
$SMTPServer = 'smtp.office365.com'
$SMTPClient = New-Object Net.Mail.SmtpClient($SMTPServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential('[email protected]','contraseña');
$Subject = $args
$Body = $args
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
Ce modèle a fonctionné sans problème pendant des années, mais récemment De nombreux utilisateurs ont commencé à rencontrer une erreur similaire à celle-ci :
Exception calling "Send" with "4" argument(s): "The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 Client not authenticated to send mail. Error: 535 5.7.139 Authentication unsuccessful, basic authentication is disabled."
Ce message indique que, même si TLS est utilisé (EnableSsl = $true), L'authentification effectuée est de type « nom d'utilisateur/mot de passe basique ».Cette fonctionnalité a été désactivée par Microsoft dans Outlook.com / Exchange Online afin de renforcer la sécurité des comptes.
L'e-mail de notification de Microsoft et sa véritable signification
Lorsque cela se produit, l'utilisateur reçoit généralement un courriel d'avertissement du genre:
« Afin de garantir la sécurité de votre compte, Microsoft ne prendra plus en charge l’utilisation d’applications de messagerie et de calendrier tierces qui nécessitent une connexion uniquement avec votre nom d’utilisateur et votre mot de passe… »
En termes pratiques, cela signifie que Envoyer le nom d'utilisateur et le mot de passe en clair (même si c'est via TLS) ne suffit pas.Microsoft souhaite que tout accès à sa plateforme de messagerie passe par des « méthodes d'authentification modernes », qui en pratique reposent sur OAuth2, des jetons et des autorisations déléguées ou d'application.
Le problème pour un simple script PowerShell qui ne vise qu'à envoyer deux e-mails par jour est que La mise en œuvre manuelle d'OAuth2 n'est pas exactement triviale.Et, dans le cas particulier des comptes Outlook.com personnels sans abonnement ni locataire Azure AD associé, vous ne disposez même pas de toutes les options offertes à un client professionnel.
Peut-on encore utiliser Outlook.com pour des scripts simples ?
Avec un compte Outlook.com 100 % personnel, sans abonnement professionnel, Vos capacités sont très limitées. Pour continuer à utiliser le protocole SMTP avec l'authentification de base à partir de scripts personnalisés, Microsoft ne fournit pas d'option claire pour « désactiver la sécurité » spécifiquement pour ce compte, et le message d'erreur que vous voyez reflète cela : l'authentification de base est désactivée, quel que soit ce que vous utilisez devant elle.
Le chancesChacune de ces options, avec ses avantages et ses inconvénients, serait la suivante :
- Passez à un serveur SMTP qui autorise encore l'authentification de base., comme le vôtre (Postfix, Exim, etc.) ou un fournisseur alternatif qui prend en charge le « mot de passe d'application » ou un système similaire.
- Installez un petit relais SMTP interne qui accepte une authentification faible de votre script et, à son tour, se connecte à un fournisseur en utilisant des méthodes modernes (cela devient déjà assez compliqué pour un usage personnel).
- Utilisez un compte différent ou un fournisseur spécialement conçu pour les automatisations. (par exemple, les services conçus pour les soumissions transactionnelles qui autorisent encore des identifiants simples sous TLS).
Il est impossible, en revanche, de « revenir sur » la décision de Microsoft depuis l'interface Outlook.com : Il n'existe pas de solution miracle pour réactiver l'ancienne authentification. Rien que pour votre cas, même si le compte ne sert qu'aux notifications et que vous ne vous souciez pas de son niveau de sécurité.
Alternatives modernes : Microsoft Graph, MailKit et autres
Si votre messagerie se trouve dans Exchange Online au sein d'un environnement de Microsoft 365 Pour les entreprises, l'approche la plus conforme aux recommandations de Microsoft consiste à utiliser Microsoft GraphLe kit de développement logiciel (SDK) Graph pour PowerShell fournit l'applet de commande Send-MgUserMail, qui envoie des messages via l'API avec une authentification moderne, sans traiter directement le protocole SMTP.
Pour des scénarios plus généraux et des fournisseurs variés, une option couramment utilisée est MailKitMailKit est une bibliothèque .NET qui prend en charge le protocole SMTP avec toutes les fonctionnalités modernes de chiffrement et d'authentification. Depuis PowerShell, vous pouvez charger l'assembly MailKit et l'utiliser comme si vous programmiez en C#, tout en bénéficiant de la flexibilité des scripts.
Dans les deux cas, cependant, Vous devrez enregistrer des applications, obtenir des identifiants client, des secrets ou des certificats, et utiliser des jetons OAuth2.Ce sont des solutions solides et sécurisées, mais considérablement plus complexes que les solutions classiques. SmtpClient.Credentials = New-Object System.Net.NetworkCredential(...).
Exemples de scripts PowerShell pour l'envoi d'e-mails avec pièces jointes et authentification
Bien que le paysage des principaux fournisseurs ait changé, Les patrons classiques restent très utiles Pour les réseaux locaux, les serveurs internes ou les fournisseurs qui acceptent encore l'authentification de base sous TLS. Vous pouvez ensuite adapter ces exemples à vos besoins.
Un exemple très simple Pour envoyer un e-mail avec une pièce jointe depuis PowerShell, vous pouvez procéder comme suit :
$file = 'C:\log_install.log'
$time = Get-Date -DisplayHint Time
$from = '[email protected]'
$to = '[email protected]'
$subject = 'Envío de log desde PowerShell'
$smtpserver = 'servermail.midominio.com'
foreach ($recipient in $to) {
Write-Host "Enviando mail a $recipient"
Send-MailMessage -SmtpServer $smtpserver -From $from -To $recipient -Subject $subject -Body "Saludos $time" -Attachments $file
}
Si le serveur SMTP requiert une authentification, vous pouvez définir un nom d'utilisateur et un mot de passe avec un PSCredential Alors:
$user = '[email protected]'
$passwd = ConvertTo-SecureString 'micontraseña' -AsPlainText -Force
$credenciales = New-Object System.Management.Automation.PSCredential ($user, $passwd)
Send-MailMessage -SmtpServer $smtpserver -From $from -To $to -Subject $subject -Body "Saludos $time" -Attachments $file -Credential $credenciales
Vous pouvez étirer le même motif en ajoutant copie, copie carbone invisible, corps HTML ou autres pièces jointesselon les besoins de votre cas d'utilisation. Il est très courant, par exemple, d'inclure des journaux ou des fichiers de sortie provenant d'un sauvegarde ou une installation automatique en tant que module complémentaire permettant de garder une trace de ce qui s'est passé.
Utilisation directe de SmtpClient dans PowerShell
Une autre méthode courante pour envoyer des e-mails depuis PowerShell consiste à instancier directement un System.Net.Mail.SmtpClientCela vous permet un contrôle plus précis sur le message, notamment lorsque vous avez besoin de plusieurs pièces jointes, de code HTML avancé, d'en-têtes personnalisés, etc.
Un exemple de base, utilisé depuis des années avec Gmail ou d'autres serveurs, serait :
$EmailPropio = '[email protected]'
$EmailDestino = '[email protected]'
$Asunto = 'Asunto del email'
$Mensaje = 'Texto del mensaje'
$ServidorSMTP = 'smtp.gmail.com'
$ClienteSMTP = New-Object Net.Mail.SmtpClient($ServidorSMTP, 587)
$ClienteSMTP.EnableSsl = $true
$ClienteSMTP.Credentials = New-Object System.Net.NetworkCredential('usuario','contraseña');
$ClienteSMTP.Send($EmailPropio, $EmailDestino, $Asunto, $Mensaje)
Et si vous souhaitez joindre un fichier, vous pouvez créer un MailMessage plus complet :
$EmailPropio = '[email protected]'
$EmailDestino = '[email protected]'
$Asunto = 'Email con adjunto'
$Texto = 'Cuerpo del mensaje'
$ServidorSMTP = 'smtp.gmail.com'
$Archivo = 'C:\carpeta\archivo.txt'
$Mensaje = New-Object System.Net.Mail.MailMessage
$Mensaje.From = $EmailPropio
$Mensaje.To.Add($EmailDestino)
$Mensaje.IsBodyHtml = $true
$Mensaje.Subject = $Asunto
$Mensaje.Body = $Texto
$Adjunto = New-Object Net.Mail.Attachment($Archivo)
$Mensaje.Attachments.Add($Adjunto)
$ClienteSMTP = New-Object Net.Mail.SmtpClient($ServidorSMTP,587)
$ClienteSMTP.EnableSsl = $true
$ClienteSMTP.Credentials = New-Object System.Net.NetworkCredential('usuario','contraseña');
$ClienteSMTP.Send($Mensaje)
Cette approche, très pratique il y a quelques années, a également été affectée par les changements apportés à l'authentification de base par les principaux fournisseurs comme Gmail ou Outlook.com. Aujourd'hui, cela convient mieux aux serveurs SMTP que vous contrôlez. ou par votre organisation pour des services gratuits aux consommateurs.
Automatisez les scripts d'e-mail avec le Planificateur de tâches Windows
Une fois votre script PowerShell fonctionnel manuellement, l'étape logique suivante est : programmez-le pour qu'il s'exécute automatiquement Vous pouvez les exécuter à tout moment ou en réponse à un événement précis. Sous Windows, cela se fait facilement grâce au Planificateur de tâches.
L'idée classique est d'enregistrer votre script dans un .ps1 sur un itinéraire accessible (par exemple, C:\scripts\enviar_correo.ps1et créer un petit lot pour le lancer :
@echo off
cd C:\scripts
powershell ./enviar_correo.ps1
Dans le Planificateur de tâches, vous configurez une nouvelle tâche dont l'action est «Lancer un programme« Et, dans la ligne de programme, vous indiquez quelque chose comme : »
powershell -file "C:\scripts\enviar_correo.ps1"
Vous pouvez ainsi associer l'exécution du script à un planning, une connexion, un événement système ou pratiquement n'importe quel déclencheur pris en charge par le Planificateur de tâches, et vous recevrez vos e-mails de notification sans avoir à vous soucier de quoi que ce soit d'autre.
Sur les serveurs plus anciens comme Windows Server 2008, n'oubliez pas que vous devrez peut-être d'abord activer l'exécution des scripts. Set-ExecutionPolicy Unrestrictedet que la manière d'appeler PowerShell depuis la tâche peut varier légèrement (par exemple, en omettant le paramètre). -file).
Combiner ces éléments (script + traitement par lots + tâche planifiée) Avec seulement quatre lignes de code, vous pouvez mettre en place un système de notification par e-mail simple mais efficace, sans avoir recours à des interfaces graphiques ni à des outils tiers.
En résumé, l'idée générale à retenir est que Continuer à envoyer des e-mails depuis Bash ou PowerShell est parfaitement viableCependant, la situation a évolué ces dernières années : les solutions classiques avec authentification de base ne fonctionnent plus que sur les serveurs SMTP que vous contrôlez ou ceux des fournisseurs qui prennent encore en charge ce modèle. Pour les grandes plateformes comme Outlook.com, Office 365 ou Gmail, la solution consiste à adopter une authentification moderne (Graph, OAuth2, bibliothèques comme MailKit) ou, si vous recherchez une solution simple et rapide, à opter pour un serveur SMTP alternatif aux politiques moins restrictives, spécialement conçu pour ce type d’automatisation.
Écrivain passionné par le monde des octets et de la technologie en général. J'aime partager mes connaissances à travers l'écriture, et c'est ce que je vais faire dans ce blog, vous montrer toutes les choses les plus intéressantes sur les gadgets, les logiciels, le matériel, les tendances technologiques et plus encore. Mon objectif est de vous aider à naviguer dans le monde numérique de manière simple et divertissante.