Il est tout à fait possible d'envoyer des e-mails via un script PowerShell en utilisant le protocole SMTP.
Le script ci-dessous effectue les opérations suivantes :
- Création de la fonction Select-FileDialog pour ouvrir une boîte de dialogue pour sélectionner un fichier.
- Demander à l'utilisateur son identifiant et son mot de passe pour se connecter à Office365 pour envoyer des e-mails via SMTP.
- Envoi d'un message de test pour vérifier la connexion. Si la connexion échoue, la demande d'identifiant et de mot de passe est répétée.
- Demande du sujet de l'e-mail, sélection du fichier HTML contenant le corps du message et sélection du fichier CSV contenant la liste des destinataires.
- Envoi des e-mails à chaque adresse électronique dans le fichier CSV en respectant les limites d'envoi de 35 e-mails par minute imposées par Office365.
########################################################
# Création d'utilisateurs + envoie d'e-mails #
# #
########################################################
# 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'envoi, 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 {
#Une limite d'envoi de 35 e-mails par minute est définie pour respecter les restrictions imposées par Office 365 via SMTP.
#Après avoir envoyé 29 e-mails, le script se met en pause pendant 65 secondes pour respecter cette limite.
$Number = 1
If ($Number -gt 30) { 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
[…] J’ai utilisé cette fonction au sein du script suivant qui permet d’envoyer des emails en PowerShell Envoyer un e-mail avec Powershell et Office 365 […]