Script de Création de Signatures
Category : Scripting
Dans les entreprises ou les établissements, les utilisateurs ont en leur possession une boite mail professionnelle et une signature électronique doit être apposée en bas de chaque mail.
Seulement la problématique est de créer et diffuser les signatures aux utilisateurs. Pour cela certain éditeurs d'applications ont mis en place des logiciels qui viennent en complément de votre messagerie, gérer ses signatures. La gestion est donc facilitée, cependant le coût d'achat de ces applications sont généralement un freins au déploiement de la solution. De ce fait certains Etablissements ne peuvent pas utiliser cette solution.
Pour répondre à ce besoin, j'ai imaginé un script qui pourrait créer un grand nombre de signatures et qui les enverrait par mail aux utilisateurs. Pour cela nous utiliserons le langage PowerShell.
Sommaire :
1 - Création du modèle de signature en HTML
2 - Récupération des identités d'un CSV
3 - Création de la signature HTML
4 - Envoi aux utilisateurs
5 - Téléchargement du Script
I - Création du Model HTML de la signature
Pour commencer nous devons créer le modèle, le Template de notre signature mail. Je vous conseil un générateur en ligne qui est assez bien fait, il s'agit de Free Mail Signature Générator.
Une fois le modèle créer, télécharger le puis insérer le code HTML dans un fichier .html à l'aide de l'outil Notepad.
II - Récupération des données d'un CSV
Le but est de récupérer les identités des utilisateurs d'un fichier CSV. Dans un premier temps je cible le fichier CSV qui porte le nom "liste-personnel-signature.csv" grâce à la fonction GetContent -Path.
La variable $idesignature récupère les données du fichier CSV.
La boucle foreach permet quant à elle permet de parcourir toutes les entrées de notre fichier csv.
# Récupération des identites dans le fichier CSV "liste.csv"
# Conversion du CSV en txt pour récupérer les caractères spéciaux
Get-Content -Path ".\liste-personnel-signature.csv" | Out-File -FilePath ".\Signatures-HTML\liste-personnel-signature_import-unicode.txt" -Encoding Unicode
$idsignature = Import-csv -Path ".\Signatures-HTML\liste-personnel-signature_import-unicode.txt" -Delimiter ";"
foreach ($item in $idsignature)
{
$Identite = $item.Prenom + " " + $item.Nom
$Fonction = $item.Fonction
$NumTel = $item.NumTel
$NumInt = $item.NumInt
$Mail = $item.Mail
Création de la signature HTML
Nous avons à présent parcourut notre fichier CSV et avons récupéré dans le contenu de chaque colonnes dans les variable.
Cependant nous allons devoirs encoder nos chaines de caractères de manière à accepter et afficher les caractères spéciaux tels que "ç" ou encore "É". Nous utiliserons alors la fonction "System.Web.HttpUtility".
#---------------------------- ENCODAGE HTML ---------------------------
$IdentiteConvert = [System.Web.HttpUtility]::HtmlEncode($Identite)
$FonctionConvert = [System.Web.HttpUtility]::HtmlEncode($Fonction)
A présent nous allons récupérer notre code HTML de la signature puis nous allons l'ajouter à notre script powershell. Pour cela voici comment procéder:
Dans un premier temps nous allons créer un fichier qui porte le nom de l'utilisateur: "$fichier_html". Puis nous allons écrire dans ce dernier le code HTML de la signature dans la varible "$html_var".
# -------------------- GENRATION DU FICHIER HTML --------------------
#Creation du fichier HTML
$fichier_html = ".\Signatures-HTML\Signature_$Identite.html"
$html_var = @"
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Signature Ozenne</title>
L'exemple précédent ne comporte par tout le code HTML afin de simplifier les explications
Ensuite il faut adapter votre code HTML de manière à transformer les chaines de caractère en variable. Par exemple ici l’affichage du nom et du prénom de l'utilisateur.
<tr style="box-sizing: border-box;">
<td style="box-sizing: border-box; padding: 0px; font-size: 12pt; font-family: Arial, sans-serif; font-weight: bold; color: rgb(61, 60, 63);"><span
class="ng-binding" style="box-sizing: border-box; font-family: Verdana, sans-serif; color: rgb(61, 60, 63);">$IdentiteConvert</span></td>
</tr>
Enfin nous terminons notre l'intégration du code HTML à notre script en fermant la balise HTML puis on stock le code contenu dans la varible "$html_var" dans le fichier de l'utilisateur "$fichier_html".
</html>
"@
# On copie le contenu HTML stocké dans la varible $html_var
Add-Content $fichier_html $html_var
Lien des images et logo : petite astuce.
Afin que vos logos et image soient toujours disponibles, et donc toujours affiché, je vous recommande de stocké ses images sur un hébergement web. Et ainsi de mettre vos URL dans votre code HTML.
https://support.google.com/accounts/answer/6010255?hl=fr
Envoi aux utilisateurs
Vous avez à présent créée vos signatures HTML, maintenant vous devrez les diffusés aux utilisateurs. Pour cela on va compléter notre script de manière à automatisé l'envoi lors de la création de la signature.
Avant toutes choses vous devrez authoriser votre boite mail à encvoyer des mail grâce à votre script. Pour GMAIL voici le lien de l'activation :
Nous allons créer un fichier texte qui contiendra le corps du mail. Ce fichier ne nomme "message-mail.txt".
ATTENTION; pour être bien interprété par notre messagerie, le fichier contenant le corps de votre message devra être formaté en UTF8-BOM, vous pouvez utiliser Notepad++ pour facilité l'encodage.
#---------------- Envoi par mail de la signaure HTML ---------------------
#La varible corpsmail récupère le texte du fichier message.txt
# ATTENTION LE FICHIER DOIT ETRE ENCODE EN UTF8-BOM POUR LA GESTION DES CARACTERES SPECIAUX
$corpsmail=Get-Content -Path ".\Documentation\message-mail.txt"
Ensuite voici le code pour configurer l'envoi du mail. Pour l'utiliser il vous faudra adapter certaines lignes.
$EmailFrom = mail de l'émetteur
$Subject = L'Objet du mail
$Body = $corpsmail (= fichier texte qui contient le corps du message)
$SMTPServer = l'adresse du serveur SMTP de l'émetteur
$FilenameAndPath1 et $FilenameAndPath2 = Le chemin de vos pièce jointes.
ATTENTION : N'oubliez pas d'ajouter l'extention du fichier ".docx" ; ".pdf" .... Pour la pièce jointe soit bien ajoutée à votre mail
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, Port du serveur)
$SMTPClient.EnableSsl = $true (Utilisation du SSL)
#Adresse mail de destination
$EmailTo = $Mail
#Adresse Mail de l'émméteur
$EmailFrom = "adresse@mail.fr"
#Sujet du Mail
$Subject = "Mise en place de Signature Mail "
#Coprs du mail (message)
$Body = $corpsmail
#serveur SMTP
$SMTPServer = "smtp.gmail.com"
#Pièce jointe à àjouter au message.
$filenameAndPath1 = ".\Signatures-HTML\Signature_$Identite.html"
$filenameAndPath2 = ".\Documentation\Procédure-Ajout-signature-mail-pro-OZENNE.pdf"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment1 = New-Object System.Net.Mail.Attachment($filenameAndPath1)
$attachment2 = New-Object System.Net.Mail.Attachment($filenameAndPath2)
$SMTPMessage.Attachments.Add($attachment1)
$SMTPMessage.Attachments.Add($attachment2)
#paramètre du serveur SMTP de google
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
Enfin deux solutions pour vous authentifier à votre boite mail émettrice :
La fonction suivante permet à utilisateur de saisir lui au travers d'une boite de dialogue ses identifiants et mot de passe. $SMTPClient.Credentials = (Get-Credential)
Par contre la fonction suivante autentifie l'utilisateur dans votre code powershell, cette méthode est la moins sécurisée car les identifiants sont écrits en clair dans le script. Cependant, cette technique est très efficace en phase de teste car elle permet de ne pas saisir vos identifiants à chaque éxecutions du script. Voici la fonction
# Appel à un élément d’authentification, qui permet à l’utilisateur de saisir son mot de passe
#$SMTPClient.Credentials = (Get-Credential)
#Authentification en clair dans le code
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("identifiant@mail.com", "motdepasse")
$SMTPClient.Send($SMTPMessage)
Enfin pour terminer notre script nous devons fermer les balises et ne pas oublier de fermer l'accolade de notre boucle Foreach.
# FIN DU SCRIPT
}