Send-MailMessage : envoyer des e-mails avec PowerShell

Vous pouvez utiliser leEnvoyer un message électroniqueapplet de commande pour envoyer des e-mails SMTP depuis PowerShell (auparavant, vous pouvez utiliser le .NetSystem.Net.Mailclasse pour envoyer des messages électroniques). Send-MailMessage permet d'envoyer des messages avec des pièces jointes, d'utiliser le format HTML pour le corps du message, d'activer la notification de livraison, d'envoyer un message à plusieurs destinataires à la fois, etc. Dans cet article, nous verrons comment utiliser l'outilSend-MailMessageapplet de commande pour envoyer des messages électroniques à partir de vos scripts PowerShell.

Contenu:

Applet de commande PowerShell Send-MailMessage : paramètres et exemples

Pour obtenir la syntaxe de l'applet de commande, exécutez cette commande :

get-help Send-MailMessage

Send-MailMessage [-To] <String[]> [-Subject] <String> [[-Body] <String>] [[-SmtpServer] <String>] [-Attachments <String[]>] [-Bcc <String[]>] [-BodyAsHtml] [-Cc <String[]>] [-Credential <PSCredential>] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding <Encoding>] -From <String> [-Port <Int32>] [-Priority {Normal | Low | High}] [-UseSsl] [<CommonParameters>]
The Send-MailMessage cmdlet sends an email message from within Windows PowerShell.

Voici les principales options :

  • Depuis– est une adresse d’expéditeur. Vous pouvez envoyer un e-mail au nom de n'importe quelle adresse e-mail si le serveur SMTP ne vérifie pas l'adresse de l'expéditeur (relais anonyme) ;
  • À– l'adresse email du destinataire ;
  • Serveur SMTP–l'adresse du serveur SMTP via lequel vous souhaitez envoyer l'e-mail.

L'adresse du serveur SMTP n'est pas requise si vous définissez l'adresse du serveur de messagerie dans la variable d'environnement $PSEmailServer :

$PSEmailServer = "smtp.woshub.com"

La commande PowerShell suivante enverra un e-mail avec le sujet et le corps spécifiés à plusieurs destinataires.

Send-MailMessage -From '[email protected]' -To '[email protected]','[email protected]' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'

Vous pouvez envoyer un e-mail à une ou plusieurs boîtes aux lettres de destinataires, à un canal Teams ou à une adresse dans un groupe de distribution Exchange.

Pour faciliter la modification des attributs d'une applet de commande, la commande Send-MailMessage peut être représentée comme suit :

Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To '[email protected]','[email protected]' `
-From '[email protected]' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'

Notez que dans la dernière commande, nous définissons en plus leUTF8encodage pour l'e-mail. Sinon, si l'objet ou le corps de l'e-mail contient des caractères non ANSI, ils ne s'afficheront pas correctement.

Windows PowerShell utilise le codage ANSI et ASCII par défaut. Si vous avez mis à jour votre version PS vers PowerShell Core, gardez à l'esprit que cette version utilise déjà le codage UTF-8 par défaut.

Vous pouvez spécifier plusieurs destinataires en utilisant les paramètres :

  • To– les adresses email des destinataires habituels ;
  • Cc– les adresses email pour envoyer une copie carbone (CC) du message email ;
  • Bcc– les adresses e-mail qui recevront une copie de l’e-mail mais ne seront pas répertoriées comme destinataire du message.

Vous pouvez activer une notification de livraison pour un e-mail en utilisant-Options de notification de livraison(qui permet d'être averti lorsque le destinataire reçoit un email). Les types de notifications disponibles sont :

  • Sur le succès(Avertir si la livraison est réussie)
  • SurÉchec(Avertir si la livraison échoue)
  • Retard(Avertir si la livraison est retardée)

Vous pouvez spécifier plusieurs options dans une seule commande :

Send-MailMessage … -DeliveryNotificationsOptions 'OnSuccess', 'OnFailure'

L'avis de livraison sera envoyé à la boîte aux lettres indiquée dans le champ « De ».

Vous pouvez également définir la priorité du message électronique (non affichée dans certains clients) :

-Priority High|Low|Normal

Si vous souhaitez ajouter une pièce jointe à votre e-mail, utilisez le-Pièces jointesoption. Dans l'exemple ci-dessous, nous allons envoyer un e-mail au format HTML (-CorpsAsHtml) et joignez file1.txt et report.xsls à partir du lecteur local.

$MailMessage = @{
To = "[email protected]"
Bcc = "[email protected]", "[email protected]"
From = "DC server <[email protected]>"
Subject = "DC Server Report"
Body = "<h1>Welcome!</h1> <p><strong>Generated:</strong> $(Get-Date -Format g)</p>”
Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding = “UTF8”
Attachment = “C:Logsfile1.txt”, “C:Logsreport.xlsx”
}
Send-MailMessage @MailMessage -Credential $cred

Dans cet exemple, nous avons également remplacé le nom d'affichage du destinataire par « DC server ».

Voici à quoi ressemble l'e-mail HTML avec pièces jointes dans l'interface Gmail.

Lorsque vous envoyez un e-mail au nom d'une boîte aux lettres partagée Exchange/Microsoft 365 pour laquelle vous disposez des autorisations SendAs, vous pouvez spécifier qu'une copie du message doit être enregistrée dans le dossier Éléments envoyés de la boîte aux lettres source. Pour cela, activez leMessageCopyForSentAsEnabledparamètre pour la boîte aux lettres :

Set-Mailbox it_dept -MessageCopyForSentAsEnabled $True

Utilisation de Send-MailMessage avec l'authentification SMTP et TLS/SSL

Par défaut, la cmdlet Send-MailMessage envoie un e-mail via le port SMTP non chiffré par défaut TCP 25. Si votre serveur SMTP autorise l'envoi d'e-mails uniquement à l'aide d'un protocole crypté, vous pouvez spécifier le numéro de port dans le champ-Portattribut (le plus souvent il s’agit de 465 ou 587) et le –Utiliser SSLoption:

-SmtpServer 'smtp.woshub.com' -Port 465 –UseSsl

Une erreur se produira si le certificat SSL du serveur SMTP ne correspond pas au FQDN spécifié dans le HELO :

Send-MailMessage: The remote certificate is invalid according to the validation procedure.

Vous pouvez également recevoir une erreur lors de l'envoi d'un e-mail à l'aide du cryptage SSL/TLS :

Send-MailMessage : Unable to read data from the transport connection: net_io_connectionclosed

Dans ce cas, il est recommandé de vérifier les points suivants

  • Que le port SMTP spécifié est ouvert et accessible depuis votre ordinateur :Test-NetConnection smtp.woshub.com –Port 465
  • Essayez un autre port SMTP. Par exemple, 587 (msa) au lieu de 465 (smtps). Le port 587 est la valeur par défaut lors de l'utilisation de l'extension STARTTLS ;
  • Si vous utilisez un système d'exploitation plus ancien (Windows Server 2012/Windows 8 et versions antérieures), vous devez activer la prise en charge du protocole TLS 1.2 pour PowerShell à l'aide de la commande :
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Le tableau ci-dessous répertorie les paramètres du serveur SMTP pour les fournisseurs de messagerie publics populaires que vous pouvez utiliser pour envoyer des messages depuis PowerShell (notez que vous devez autoriser l'envoi d'e-mails via SMTP dans l'interface du compte.) :

NomAdresse du serveur SMTPPortType de cryptage
Gmailsmtp.gmail.com587

25

465

TLS

TLS

SSL

Microsoft (Office) 365smtp.office365.com587TLS
Outlook.comsmtp-mail.outlook.com587TLS
Yahoosmtp.mail.yahoo.com587TLS
Courrier iCloudsmtp.mail.me.com587TLS
AOLsmtp.aol.com465SSL

Si le serveur SMTP n'autorise pas les e-mails anonymes (le relais est refusé), vous verrez cette erreur :

5.7.1 Client was not authenticated.

ou:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM.

Ensuite, vous pouvez vous authentifier auprès du serveur SMTP en utilisant le-Identifiantoption.

Vous pouvez demander de manière interactive les informations d'identification de l'utilisateur pour l'authentification :

Send-MailMessage …… -Credential (Get-Credential)

Vous pouvez également spécifier les informations d'identification du compte à utiliser pour l'authentification dans la variable :

$cred = Get-Credential
Send-MailMessage ... -Credential $cred

Comment envoyer un e-mail via SMTP Gmail avec PowerShell ?

Pour envoyer un email depuis votre boîte mail sur l'un des services de messagerie publics, il est recommandé d'utiliser unMot de passe de l'applicationau lieu d'un mot de passe pour accéder à votre compte/boîte mail. Par exemple, dans Gmail, vous pouvez créer un mot de passe d'application après avoir activé l'authentification à deux facteurs pour votre compte Google. Générez et copiez le mot de passe de votre application sur Google (c'est un mot de passe à 16 caractères).

L'exemple suivant montre comment envoyer un e-mail depuis votre boîte aux lettres Google à l'aide de PowerShell. Vous devez utiliser le mot de passe de l'application au lieu du mot de passe de votre compte Google. Dans cet exemple, nous spécifierons le mot de passe de l'application pour se connecter au serveur SMTP Gmail directement dans le code du script PowerShell.

$From = "[email protected]"
$To = "[email protected]"
$Subject = "Test PowerShell email from $($env:computername)"
$Body = "some message test "
$Password = "your_google_app_password" | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $From, $Password
Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer "smtp.gmail.com" -port 587 -UseSsl -Credential $Credential

Voir aussi :Comment supprimer des fichiers directement sans les envoyer à la corbeille sous Windows 10

Notez que PowerShell enregistre la commande avec le mot de passe en texte brut dans le fichier historique des commandes PowerShell.

Un avertissement s'affiche lorsque vous utilisez la commande Send-MailMessage dans les nouvelles versions de PowerShell Core 7.x :

WARNING: The command 'Send-MailMessage' is obsolete. This cmdlet does not guarantee secure connections to SMTP servers. While there is no immediate replacement available in PowerShell, we recommend you do not use Send-MailMessage at this time. See https://aka.ms/SendMailMessage for more information.

L'applet de commande Send-MailMessage utilise la classe .NET SmtpClient qui ne prend pas en charge les méthodes d'authentification modernes, notamment l'authentification moderne Microsoft. Il est recommandé d'utiliser l'API Graph pour envoyer des e-mails depuis PowerShell via Microsoft 365/Exchange Online (en utilisant leSend-MgUserMailapplet de commande ouInvoke-RestMethodpour appeler la méthode sendMail via l'API REST).

Related Posts