Pour ce cmdlet PowerShell du jour, nous allons couvrir le cmdlet PowerShell Send-MailMessage. Cette cmdlet PowerShell sert un but et un seul ; envoyer des e-mails de nombreuses façons différentes.
Puisqu’il y a tellement de façons dont la cmdlet Send-MailMessage peut envoyer des messages électroniques, plongeons tout de suite et commençons à couvrir tous les exemples courants que vous pouvez rencontrer. Dans cet article, nous allons couvrir de nombreux exemples allant du plus simple jusqu’à certains scénarios que je ne souhaite à personne !
Ce post sera une excellente ressource à mettre dans vos favoris si jamais vous rencontrez des cas où vous devez envoyer des e-mails avec PowerShell et que vous oubliez la syntaxe.
Table des matières
Le serveur SMTP
Tout courriel doit passer par un serveur SMTP quelque part via un serveur et un port. Pour spécifier un le serveur SMTP à utiliser, utilisez un paramètre appelé SMTPServer
qui vous permet de spécifier le serveur SMTP pour établir une connexion et relayer le courrier à travers. Cependant, il n’est pas obligatoire.
Si vous ne spécifiez pas de valeur pour le paramètre SMTPServer
, la valeur stockée dans la variable de préférence $PSEmailServer
sera utilisée. Vous pouvez attribuer une valeur à cette variable comme vous le feriez pour toute autre variable.
PS51> $PSEmailServer = 'smtp.server.local'
Cependant, cette variable ne vit pas à travers les sessions PowerShell. Cela signifie que vous devez la définir à chaque fois qu’une nouvelle session PowerShell est ouverte. Pour cette raison, je recommande soit de l’utiliser en la définissant au-dessus de votre référence Send-MailMessage
, soit de ne pas la définir du tout. À la place, je fournirais personnellement la valeur du paramètre SMTPServer
. De cette façon, vous n’avez pas à gérer une variable extérieure qui pourrait changer sur vous.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local'
Port
Par défaut, la valeur que le cmdlet va tenter d’envoyer un email via le serveur SMTP est le port 25. Il s’agit du SMTP ordinaire, non crypté. Cependant, de nos jours, il est plus courant d’envoyer des courriels chiffrés en utilisant SSL/TLS (Nous couvrirons ces scénarios plus tard).
Si vous devez changer le port de 25, vous pouvez utiliser le paramètre Port
.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587
Destinataires et expéditeurs
Pour envoyer un courriel à différents destinataires via des méthodes comme les champs To, Cc et Bcc, le cmdlet dispose de différents paramètres pour s’adapter.
Les paramètres To, Cc et Bcc du cmdlet Send-Mailmessage
Le cmdlet dispose de trois paramètres prenant chacun en charge plusieurs destinataires séparés par une virgule appelés To
Cc
et Bcc
.
Vous pouvez spécifier des adresses uniques comme ci-dessous.
PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'
Ou vous pouvez spécifier plusieurs destinataires pour chaque valeur de paramètre.
PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'
Le paramètre From
Lorsque vous envoyez un courriel, vous pouvez également spécifier le paramètre From
qui définira l’en-tête reply-to dans le courriel. Ce paramètre ne permet qu’une seule adresse. Si un destinataire choisit de répondre à l’email, ce sera l’adresse email à laquelle cette réponse reviendra.
PS51> Send-MailMessage -From -To -Subject 'this is a subject'
Par défaut, l’utilisation d’une adresse email affichera simplement l’adresse email dans le champ FROM du destinataire. Cependant, si vous souhaitez spécifier un nom ou une sorte d’étiquette comme Service Account Mailbox, vous pouvez également spécifier un nom et une adresse électronique comme:
Adam Bertram <>
Notez que le paramètre
Subject
a été utilisé. Ce paramètre est toujours obligatoire. Vous verrez ce paramètre utilisé dans tous les exemples.
Corps
Le paramètre Body
vous permet de spécifier ce qui se trouvera dans le corps du courriel. Au plus simple, vous pouvez spécifier n’importe quel texte que vous souhaitez et le cmdlet l’enverra via du texte en clair.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Envoi de courriels au corps HTML
Vous pouvez également envoyer un corps de courriel via du HTML plutôt que du texte en clair. Pour ce faire, utilisez le même paramètre Body
que pour le texte en clair, mais utilisez HTML pour la chaîne de caractères et utilisez le paramètre de commutation BodyAsHtml
.
$body = @'<table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr></table>'@PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body $body -BodyAsHtml
Notez que dans l’exemple ci-dessus, j’ai enfermé la chaîne du corps dans
@'
et'@
. C’est ce qu’on appelle une here string. Cela vous permet de définir de longues chaînes de caractères que l’on voit généralement dans les corps de courriel et qui contiennent des retours de chariot. Les chaînes Here préservent le formatage des chaînes de caractères et constituent un excellent moyen de définir le corps du courriel, surtout s’il est en HTML.
Encodage
Si vous avez des caractères spéciaux dans l’objet ou le corps de votre courriel, vous pouvez utiliser le paramètre Encoding
. Ce paramètre vous permet d’encoder l’objet et le corps de l’email via le type d’encodage spécifié avant l’envoi.
Vous avez ici quelques options :
- ASCII (par défaut)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Default
- OEM
.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8
Joints
Le cmdlet peut également joindre un ou plusieurs fichiers. Pour ce faire, vous pouvez utiliser le paramètre Attachments
et fournir le chemin d’accès au(x) fichier(s) que vous souhaitez joindre.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'
Vous pouvez également spécifier plusieurs pièces jointes via une collection en les séparant par une virgule.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'
Le paramètre Attachments
vous permet également de canaliser des fichiers via des cmdlets. comme Get-Item
et Get-ChildItem
vers le cmdlet Send-MailMessage
également.
PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Courrier électronique sécurisé et authentifié
Par défaut, la cmdlet envoie le courrier électronique via une communication SMTP non chiffrée sur le port 25. Cependant, elle prend également en charge l’envoi de courriels chiffrés via SSL/TLS avec un nom d’utilisateur et un mot de passe.
Si vous tentez de relayer des courriels via un serveur SMTP qui nécessite une authentification, la commande échoue avec un message d’erreur comme ci-dessous.
The SMTP server requires a secure connection or the client was notauthenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.
Pour y remédier, vous devez d’abord spécifier le port (généralement 587 pour TLS) et le paramètre UseSsl
. Cela indique à la cmdlet de tenter de se connecter au port 587 sur le serveur SMTP et de chiffrer l’intégralité du message. Vous devrez généralement (toujours ?) également spécifier le nom d’utilisateur/mot de passe pour vous authentifier auprès du serveur SMTP en utilisant le paramètre Credential
.
PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential
Au-dessus, je saisis un objet de justificatif (PSCredential) à l’aide du cmdlet
Get-Credential
. Cela pose parfois un problème car c’est interactif, ce qui signifie qu’il arrête le script pour demander un nom d’utilisateur et un mot de passe. Pour éviter cela, vous pourriez créer un objet PSCredential à la volée.
Un exemple courant de messagerie consiste à utiliser Gmail. En utilisant les connaissances que vous avez acquises ci-dessus, vous pouvez maintenant facilement envoyer des courriels par le biais de Gmail en utilisant le serveur SMTP smtp.gmail.com, comme indiqué ci-dessous.
$gmailCred = Get-Credential$sendMailParams = @{ From = '' ## Must be gmail.com To = '' Subject = 'some subject' Body = 'some body' SMTPServer = 'smtp.gmail.com' SMTPPort = 587 UseSsl = $true Credential = $gmailCred}Send-MailMessage @sendMailParams
Attribution de la priorité des courriels
Bien qu’il s’agisse d’une fonctionnalité de la messagerie que je souhaite personnellement voir mourir, vous pouvez attribuer des niveaux de priorité aux courriels que vous envoyez via le paramètre Priority
. Cette priorité est ensuite interprétée de différentes manières par le client de messagerie.
Send-mailmessage vous permet d’attribuer à un courriel trois priorités différentes.
- Normal (par défaut)
- Haut
- Bas
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High
Mais s’il vous plaît, pour l’amour de Dieu, ne pensez pas que tous vos courriels sont de haute priorité !
Notifications de livraison
Enfin, vous pouvez spécifier des notifications de livraison pour les courriels. Les notifications de livraison sont ce que l’on appelle généralement des accusés de réception de lecture dans certains clients de messagerie. Les notifications de livraison vous permettent d’être informé si/quand le courriel est reçu par le destinataire. Cependant, le destinataire doit encore l’autoriser.
Vous avez quatre options lorsque vous demandez des notifications de livraison.
- Non (par défaut)
- OnSuccess (lorsque l’email est livré avec succès)
- OnFailure (notifier si la livraison est infructueuse)
- Delay. (lorsque l’email est retardé via un serveur SMTP)
Vous pouvez spécifier une option de notification de livraison en utilisant le paramètre DeliveryNotificationOptions
.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'
Vous pouvez également demander plusieurs notifications de livraison à la fois en les séparant par une virgule.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'
Résumé
Dans ce billet, vous avez tout appris sur le cmdlet Send-mailmessage et ce qu’il peut. Nous avons couvert cette cmdlet en profondeur en utilisant chaque paramètre qu’il a avec des exemples. J’espère que ce post peut servir de référence pour vous lors de l’utilisation du cmdlet Send-mailmessage.
Lecture complémentaire
Ne manquez pas de consulter d’autres posts connexes !
- Utilisation de la
Get-ChildItem
cmdlet PowerShell - Utilisation de la
Set-Content
cmdlet PowerShell - Utilisation de la
Out-File
cmdlet PowerShell
.