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

 

 

Laisser un commentaire

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