Envoyer un e-mail avec Powershell et Office 365

By Enzo
powershell

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 :

  1. Création de la fonction Select-FileDialog pour ouvrir une boîte de dialogue pour sélectionner un fichier.
  2. Demander à l'utilisateur son identifiant et son mot de passe pour se connecter à Office365 pour envoyer des e-mails via SMTP.
  3. 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.
  4. 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.
  5. 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

By Enzo

Je suis ingénieur système et je suis passionné par le monde de l’informatique et des technologies.

One thought on “Envoyer un e-mail avec Powershell et Office 365”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.