J'ai ce script PowerShell pour l'envoi d'e-mails avec pièces jointes, mais lorsque j'ajoute plusieurs destinataires, seul le premier reçoit le message. J'ai lu la documentation et n'arrive toujours pas à comprendre. Je vous remercie
$recipients = "Marcel <[email protected]>, Marcelt <[email protected]>"
Get-ChildItem "C:\Decrypted\" | Where {-NOT $_.PSIsContainer} | foreach {$_.fullname} |
send-mailmessage -from "[email protected]" `
-to "$recipients" `
-subject "New files" `
-body "$teloadmin" `
-BodyAsHtml `
-priority High `
-dno onSuccess, onFailure `
-smtpServer 192.168.170.61
$recipients = "Marcel <[email protected]>, Marcelt <[email protected]>"
est le type de string
vous devez passer à send-mailmessage
un type string[]
(un tableau):
[string[]]$recipients = "Marcel <[email protected]>", "Marcelt <[email protected]>"
Je pense que ne pas lancer à la chaîne [] faire le travail pour les règles de coercition de powershell:
$recipients = "Marcel <[email protected]>", "Marcelt <[email protected]>"
est de type object[]
mais peut effectuer le même travail.
Créer un tableau Powershell fera l'affaire
$recipients = @("Marcel <[email protected]>", "Marcelt <[email protected]>")
La même approche peut être utilisée pour les pièces jointes
$attachments = @("$PSScriptRoot\image003.png", "$PSScriptRoot\image004.jpg")
Pour définir un tableau de chaînes, il est plus pratique d’utiliser $ Var = @ ('User1', 'User2').
$servername = hostname
$smtpserver = 'localhost'
$emailTo = @('username1 <[email protected]>', 'username2<[email protected]>')
$emailFrom = 'SomeServer <[email protected]>'
Send-MailMessage -To $emailTo -Subject 'Low available memory' -Body 'Warning' -SmtpServer $smtpserver -From $emailFrom
Vous devez d'abord convertir le string en un tableau string, comme ceci:
$recipients = "Marcel <[email protected]>,Marcelt <[email protected]>"
[string[]]$To = $recipients.Split(',')
Puis utilisez Send-MailMessage
comme ceci:
Send-MailMessage -From "[email protected]" -To $To -subject "New files" -body "$teloadmin" -BodyAsHtml -priority High -dno onSuccess, onFailure -smtpServer 192.168.170.61
C'est vrai, chaque adresse doit être citée. Si vous avez plusieurs adresses répertoriées sur la ligne de commande, Send-MailMessage l’apprécie si vous spécifiez les parties adresse conviviale et adresse électronique.
pour un meilleur comportement, créez une classe avec une méthode comme celle-ci
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddCommand("Send-MailMessage")
.AddParameter("SMTPServer", "smtp.xxx.com")
.AddParameter("From", "[email protected]")
.AddParameter("Subject", "xxx Notification")
.AddParameter("Body", body_msg)
.AddParameter("BodyAsHtml")
.AddParameter("To", recipients);
// invoke execution on the pipeline (ignore output) --> nothing will be displayed
PowerShellInstance.Invoke();
}
Ces instances sont appelées dans une fonction comme:
public void sendEMailPowerShell(string body_msg, string[] recipients)
N'oubliez jamais d'utiliser un tableau de chaînes pour les destinataires, qui peut ressembler à ceci:
string[] reportRecipient = {
"xxx <[email protected]>",
"xxx <[email protected]>"
};
ce message peut être saturé en paramètre de la méthode elle-même, le codage HTML activé !!
n'oubliez jamais d'utiliser un tableau de chaînes en cas de destinataires multiples, sinon seule la dernière adresse de la chaîne sera utilisée !!!
mail reportMail = new mail(); //instantiate from class
reportMail.sendEMailPowerShell(reportMessage, reportRecipient); //msg + email addresses