Envoyez des e-mails facilement avec la cmdlet PowerShell Send-MailMessage

Pour cette cmdlet PowerShell du jour, nous couvrons la cmdlet PowerShell Send-MailMessage. Cette cmdlet PowerShell a un seul but : envoyer des e-mails de différentes manières.

Comme il existe de nombreuses façons dont la cmdlet Send-MailMessage peut envoyer des messages électroniques, plongeons directement dedans et commençons à couvrir tous les exemples courants auxquels vous pouvez être confrontés. Dans cet article, nous allons couvrir de nombreux exemples, allant du plus simple aux scénarios que je ne souhaite à personne !

Cet article sera une excellente ressource à mettre en signet au cas où vous auriez besoin d’envoyer des e-mails avec PowerShell et que vous oubliiez la syntaxe.

Le serveur SMTP

Tous les e-mails doivent passer par un serveur SMTP via un serveur et un port. Pour spécifier 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 les e-mails. Cependant, ce 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 n’importe quelle autre variable.

Assigning a value to the $PSEmailServer preference variable
PS51> $PSEmailServer = 'smtp.server.local'

Cependant, cette variable ne persiste pas entre 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 la définir au-dessus de votre référence Send-MailMessage, soit de ne pas la définir du tout. À la place, je vous conseille de fournir personnellement la valeur du paramètre SMTPServer. De cette manière, vous n’aurez pas à gérer une variable externe qui pourrait changer.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local'

Port

Par défaut, la valeur par laquelle la commande essaiera d’envoyer un e-mail via le serveur SMTP est le port 25. Il s’agit de SMTP simple, non chiffré. Cependant, de nos jours, il est plus courant d’envoyer des e-mails chiffrés en utilisant SSL/TLS (nous aborderons ces scénarios plus tard).

Si vous avez besoin de changer le port à partir 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 e-mail à différents destinataires via des méthodes telles que les champs To, Cc et Bcc, la commande dispose de divers paramètres pour accommoder cela.

Les Paramètres To, Cc et Bcc dans la Commande Send-Mailmessage

La commande dispose de trois paramètres supportant chacun plusieurs destinataires séparés par une virgule appelés To, Cc et Bcc.

Vous pouvez spécifier des adresses simples comme ci-dessous.

Sending email to one recipient via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com -Cc bob@gmail.com -Bcc susie@hotmail.com -Subject 'this is a subject'

Ou vous pouvez spécifier plusieurs destinataires pour chaque valeur de paramètre.

Sending email to multiple recipients via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com, tony@mycompany.local -Cc bob@gmail.com, rick@othercompany.com -Bcc susie@hotmail.com,secret@fooorg.org -Subject 'this is a subject'

Le Paramètre From

Lors de l’envoi d’un e-mail, vous pouvez également spécifier le paramètre From qui définira l’en-tête de réponse dans l’e-mail. Ce paramètre ne permet qu’une seule adresse. Si un destinataire choisit de répondre à l’e-mail, cette adresse e-mail sera celle à laquelle la réponse sera renvoyée.

Sending email from an address
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject'

Par défaut, l’utilisation d’une adresse e-mail affichera simplement l’adresse e-mail dans le champ FROM du destinataire. Cependant, si vous souhaitez spécifier un nom ou une sorte d’étiquette comme Boîte aux lettres du compte de service, vous pouvez également spécifier un nom et une adresse e-mail comme suit :

Adam Bertram <adbertram@gmail.com>

Remarquez que le paramètre Subject a été utilisé. Ce paramètre est toujours requis. Vous verrez ce paramètre utilisé dans tous les exemples.

Corps

Le paramètre Body vous permet de spécifier le contenu de l’e-mail. Le plus simplement, vous pouvez spécifier n’importe quel texte que vous souhaitez et la cmdlet l’enverra en texte brut.

PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

Envoi d’e-mails avec un corps HTML

Vous pouvez également envoyer un corps d’e-mail au format HTML plutôt qu’en texte brut. Pour ce faire, utilisez le même paramètre Body que vous utiliseriez avec du texte brut, mais utilisez HTML pour la chaîne et utilisez le commutateur BodyAsHtml.

Sending an HTML table in an email
$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 me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body $body -BodyAsHtml

Remarque dans l’exemple ci-dessus, j’ai encadré la chaîne de corps avec @' et '@. Cela s’appelle une chaîne ici. Cela vous permet de définir de longues chaînes typiquement vues dans les corps de courrier électronique qui contiennent des retours chariot. Les chaînes ici préservent le formatage des chaînes et sont un excellent moyen de définir le corps de l’e-mail, surtout s’il est en HTML.

Codage

Si vous avez des caractères spéciaux dans le sujet ou le corps de votre e-mail, vous pouvez utiliser le paramètre Codage. Ce paramètre vous permet de coder le sujet et le corps de l’e-mail via le type de codage spécifié avant l’envoi.

Vous avez quelques options ici :

  • ASCII (par défaut)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Défaut
  • OEM
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

Pièces jointes

La cmdlet peut également attacher un ou plusieurs fichiers. Pour ce faire, vous pouvez utiliser le paramètre Pièces jointes et fournir le chemin d’accès au(x) fichier(s) que vous souhaitez joindre.

Attaching the C:\file.doc to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -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.

Attaching the C:\file.doc and D:\report.xlsx file to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

Le paramètre Pièces jointes vous permet également de transférer des fichiers via des cmdlets comme Get-Item et Get-ChildItem vers la cmdlet Send-MailMessage également.

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

E-mail sécurisé et authentifié

Par défaut, le cmdlet envoie des e-mails via une communication SMTP non chiffrée sur le port 25. Cependant, il prend également en charge l’envoi d’e-mails chiffrés via SSL/TLS avec un nom d’utilisateur et un mot de passe.

Si vous essayez de relayer un e-mail via un serveur SMTP qui nécessite une authentification, la commande échoue avec un message d’erreur comme ci-dessous.

Error message when attempting to send unencrypted email.
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

Pour remédier à cela, vous devez d’abord spécifier le port (typiquement 587 pour TLS) et le paramètre UseSsl. Cela indique au cmdlet d’essayer de se connecter au port 587 sur le serveur SMTP et de chiffrer l’ensemble du message. Vous devrez probablement (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-Credential
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

Je récupère ci-dessus un objet d’identification (PSCredential) en utilisant le cmdlet Get-Credential. Cela pose parfois un problème car c’est interactif, ce qui signifie qu’il interrompt 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.

A common email example is to use Gmail. Using the knowledge you’ve gained above, you can now easily send email through Gmail using the smtp.gmail.com SMTP server as shown below.

$gmailCred = Get-Credential

$sendMailParams = @{
    From = '[email protected]' ## Doit être gmail.com
    To = '[email protected]'
    Subject = 'some subject'
    Body = 'some body'
    SMTPServer = 'smtp.gmail.com'
    SMTPPort = 587
    UseSsl = $true
    Credential = $gmailCred
}

Send-MailMessage @sendMailParams

Attribution de la priorité des e-mails

Bien qu’une fonctionnalité des e-mails que je souhaite personnellement voir disparaître, vous pouvez attribuer des niveaux de priorité aux e-mails 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 électronique.

High priority message in Outlook

Send-mailmessage vous permet d’attribuer un e-mail avec trois priorités différentes.

  • Normal (par défaut)
  • Élevée
  • Basse
Assigning a high-priority email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -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 e-mails sont prioritaires !

Notifications de livraison

Enfin, vous pouvez spécifier des notifications de livraison pour les e-mails. Les notifications de livraison sont ce que l’on appelle généralement des accusés de réception dans certains clients de messagerie. Les notifications de livraison vous permettent d’être informé si/quand l’e-mail est reçu par le destinataire. Cependant, le destinataire doit encore l’autoriser.

Vous avez quatre options lorsque vous demandez des notifications de livraison.

  • Aucune (par défaut)
  • En cas de succès (lorsque la livraison de l’e-mail est réussie)
  • En cas d’échec (notification si la livraison échoue)
  • En cas de retard (lorsque l’e-mail est retardé via un serveur SMTP)

Vous pouvez spécifier une option de notification de livraison en utilisant le paramètre DeliveryNotificationOptions.

Requesting a notification on delivery
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

Vous pouvez également demander plusieurs notifications de livraison en même temps en les séparant par une virgule.

Requesting a notification for all types
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

Résumé

Dans cet article, vous avez appris tout sur la commande Send-MailMessage et ce qu’elle peut faire. Nous avons couvert cette commande de manière approfondie en utilisant tous les paramètres disponibles ainsi que des exemples. J’espère que cet article pourra vous servir de référence lorsque vous utiliserez la commande Send-MailMessage.

Lecture complémentaire

N’hésitez pas à consulter d’autres articles connexes !

Source:
https://adamtheautomator.com/send-mailmessage/