Envoyer un e-mail avec Powershell et Office 365
Il est tout à fait possible d’envoyer des e-mails via un script powershell en utilisant le protocole SMTP.
Voici ci-dessous un script Powershell permettant d’envoyer un e-mail à une liste d’utilisateur contenu dans un fichier au format csv. Ce script utilise le serveur SMTP d’Office 365 (smtp.office365.com) et il prend en compte sa limite de 35 mails/min.
######################################################## # Création d'utilisateurs + envoie d'e-mails # #Source: # #Fonction sélection de fichier: http://bit.ly/1lN625Y # # # ######################################################## # Cette fonction nous permet ensuite d'avoir une boite de dialogue # pour sélectionner les fichiers que l'on a besoin. function Select-FileDialog { param([string]$Title,[string]$Directory,[string]$Filter="All Files (*.*)|*.*") [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null $objForm = New-Object System.Windows.Forms.OpenFileDialog $objForm.InitialDirectory = $Directory $objForm.Filter = $Filter $objForm.Title = $Title $Show = $objForm.ShowDialog() If ($Show -eq "OK") { Return $objForm.FileName } Else { Write-Error "Operation cancelled by user." } } # On récupère l'identifiant permettant d'envoyer un e-mail via un serveur SMTP Office365 # On envoie un message de test à l'utilisateur cherchant à s'identifier # S'il n'y a pas d'erreur d'envoie, on continue, sinon on boucle. DO{ $email_id = Read-Host 'What is your email?' $email_pwd = Read-Host -assecurestring 'What is your password?' $cred = New-Object System.Management.Automation.PSCredential ("$email_id",$email_pwd) Send-MailMessage -SmtpServer 'smtp.office365.com' -port 587 -usessl ` -credential $cred -from $email_id -To $email_id -subject 'test connexion'; }While($? -eq $false) #Sujet du message, sélection du mail préparé au format HTML, sélection du fichier contenant les e-mails. $email_subject = Read-Host 'Sujet de votre e-mail ?' $select_html = Select-FileDialog -Title "Select HMTL mail" -Filter "HTML|*.html" $html = Get-Content -Raw -Path $select_html; $select_csv = Select-FileDialog -Title "Select csv user email list" -Filter "CSV|*.csv" $Number = 1; $NumberT = 1; Import-Csv -Delimiter ";" -Path $select_csv| ForEach-Object { #Parceque j'utilise les serveurs Office 365, limité à 35 mails/min, une limite d'envoie de message est défini. If ($Number -gt 30) { #Office 365 bloque l'envoie de plus de 35 mails/min en SMTP donc on pause tous les 29 messages pour 65 secondes. Start-Sleep 65 $Number = 1 } else { Send-MailMessage -SmtpServer 'smtp.office365.com' -port 587 -usessl -credential $cred ` -from $email_id -To $_.Emails -subject "$email_subject" -BodyAsHtml $html; echo "Message $NumberT envoyé -- $Emails"; $Number++; $NumberT++; } }
Exemple de contenu du fichier CSV:
Name;Emails Toto;Toto@yopmail.com