├── coordonnees_eleves.ods ├── coordonnees_eleves.csv ├── LICENSE ├── publipostage.py └── README.md /coordonnees_eleves.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tpaviot/publipostage/master/coordonnees_eleves.ods -------------------------------------------------------------------------------- /coordonnees_eleves.csv: -------------------------------------------------------------------------------- 1 | Davd Dupont;ddupon@gemele.com;https://fghlglfdhlkj654654654 2 | Emilie Durand;emdurand@hottemele.com;https://fghlglfdhlkj654654997 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Thomas Paviot 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /publipostage.py: -------------------------------------------------------------------------------- 1 | # Thomas Paviot, 2020 tpaviot@gmail.com 2 | # Vous pouvez utiliser ce script comme bon vous semble. 3 | 4 | import email 5 | import smtplib 6 | import os 7 | from getpass import getpass 8 | 9 | # création de la connexion au serveur 10 | # changer la ligne suivante pour qu'elle corresponde au nom et au port 11 | # du serveur SMTP qui va envoyer l'email. 12 | 13 | s = smtplib.SMTP("machin.ac-lamaison.fr", 145) 14 | s.ehlo() 15 | s.starttls() # utilisation de TLS 16 | s.ehlo() 17 | 18 | addr_expediteur = "leprofesseur@confinement.fr" # cette adresse ne change pas 19 | 20 | # connexion 21 | # la ligne suivante permet de taper le mot de passe sans qu'il apparaisse en clair à l'écran 22 | password = getpass("Veuillez entrer votre mot de passe :") 23 | s.login(addr_expediteur, password) 24 | 25 | # on ouvre le fichier en mode lecture 26 | csv_file = os.path.join(".", "coordonnees_eleves.csv") 27 | contenu_fichier = open(csv_file, "r") 28 | 29 | # le modèle d'email qui va être envoyé à chaque destinataire. %s est une chaîne de caractère 30 | # qui sera différente dans chaque email. Pour pouvoir faire les choses proprement, on pourrait utiliser 31 | # un "moteur de template", style jinja, mais pour l'instant ça suffit. 32 | 33 | # attention, dans ce modèle il faut au moins un saut de ligne en début de corps de message, 34 | # sinon ça ne fonctionne pas. 35 | 36 | MODELE_EMAIL = """ 37 | 38 | Bonjour %s, 39 | 40 | Veuillez trouver votre copie en suivant le lien suivant : 41 | %s 42 | 43 | Bien à vous, 44 | 45 | Le professeur 46 | 47 | """ 48 | 49 | # Ensuite on boucle sur les lignes du fichier csv pour construire chaque email 50 | # et l'envoyer 51 | for ligne in contenu_fichier: 52 | # on récupère le nom de l'élève 53 | nom_eleve, mail_destinataire, lien_vers_le_fichier = ligne.split(";") 54 | # on crée le contenu du message à partir du modèle 55 | contenu_message = MODELE_EMAIL % (nom_eleve, lien_vers_le_fichier) 56 | # ensuite on crée le message 57 | msg = email.message_from_string(contenu_message) # le contenu 58 | msg['From'] = expediteur # email de l'expéditeur 59 | msg['To'] = mail_destinataire # email du destinataire 60 | msg['Subject'] = contenu_message # le corps du message du mail 61 | # si on veut on peut décommenter la ligne suivante pour voir ce qui va être envoyé 62 | # print(msg) 63 | # envoi du message 64 | s.sendmail(expediteur, mail_destinataire, msg.as_string()) 65 | 66 | # finalement on ferme le fichier 67 | contenu_fichier.close() 68 | # ainsi que la connexion 69 | s.quit() 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | publipostage.py 2 | =============== 3 | 4 | Envoyer par email un message personnalisé à quelques éléments de son carnet d'adresse. 5 | 6 | Le problème 7 | ----------- 8 | 9 | La situation est la suivante : un professeur désire envoyer par email, à chaque élève, un lien internet vers sa copie corrigée numériquement et déposée sur un cloud quelconque (google drive, dropbox etc.). Chaque lien étant différent, afin de préserver la confidentialité des échanges entre le professeur et l'élève, il faut envoyer un message différent à chaque élève. 10 | 11 | Imaginons la classe fictive suivante, composée de deux élèves : 12 | 13 | ``` 14 | David Dupont (ddupont__at__gémèle__dot__com) 15 | Emilie Durand (emdurand__at__hotte_mèle__dot_com) 16 | ``` 17 | 18 | Le message envoyé à chaque étudiant sera le suivant: 19 | 20 | ```bash 21 | Bonjour David Dupont, 22 | 23 | Vous pouvez télécharger votre copie en cliquant sur le lien suivant : 24 | https://drive/lklkjglkjdljksd544334 25 | 26 | Bien à vous, 27 | 28 | Le professeur 29 | ``` 30 | 31 | et évidemment le deuxième qui aura la même forme, avec le nom qui change ainsi que le lien sur lequel cliquer. 32 | 33 | Solution 34 | -------- 35 | Un script Python qui automatise l'envoie de mail, à partir de la saisie des informations dans un tableau (MS Office, Excel etc.) 36 | 37 | Etape 1 38 | ------- 39 | 40 | Créer une nouvelle feuille, avec son tableau, qui contient trois colonnes : la première pour le nom de l'élève, la deuxième pour son adresse email, la troisième pour le lien à envoyer. 41 | 42 | Etape 2 43 | ------- 44 | Depuis le tableau, enregistrer la feuille dans un fichier au format CSV. Choisir le point virgule comme séparateur de champs. 45 | Enregistrer ce fichier avec le nom ```coordonnees_eleves.csv``` 46 | Le fichier aura la forme suivante: 47 | 48 | ```bash 49 | David Dupont; ddupont__at__gémèle__dot__com; https://fghlglfdhlkj654654654 50 | Emilie Durand; emdurand__at__hotte_mèle__dot_com; https://fghlglfdhlkj654654997 51 | [...] 52 | ``` 53 | 54 | Etape 3 55 | ------- 56 | Il faut connaître l'adresse et le port du serveur SMTP qui va servir à l'envoi des messages. Si vous ne le connaissez pas, il suffit souvent de taper dans un moteur de recherche "SMTP orange.fr" ou "SMTP hotmail.fr", et on trouve l'information, qui est publque. Par exemple, pour le serveur qui gère les adresses académiques à ac-dijon.fr, c'est "hermes.ac-dijon.fr", port 465 (voir par exemple http://ien21-ouest.ac-dijon.fr/IMG/pdf/Configurer_Thunderbird_V5.pdf). 57 | 58 | Une fois que vous avez cette information, éditer le script publipostage.py et changer les lignes en question. Vous devez aussi renseigner votre adresse email. 59 | 60 | Etape 4 61 | ------- 62 | Exécuter le script Python permettant d'envoyer un email à chaque élève. 63 | 64 | ```bash 65 | $ python publipostage.py 66 | ``` 67 | 68 | Vous devez entrer le mot de passe qui vous permettra de vous connecter au serveur. 69 | 70 | Remarque 71 | -------- 72 | Une installation Python standard suffit, inutile de sortir l'artillerie lourde avec WinPython, anaconda etc. 73 | 74 | Pour aller plus loin 75 | -------------------- 76 | Le script Python est très simple, adaptable à toute situation similaire (avec plus de cases, personnalisation du message différente etc.) 77 | 78 | Toute contribution pour améliorer la situation est la bienvenue. --------------------------------------------------------------------------------