Commit c52f7d0e authored by Nicolas Ollinger's avatar Nicolas Ollinger

hello world

parents
.DS_Store
__pycache__
File added
Robot de mailing -- écrit en vitesse en post-COVID19
Script python pour automatiser l'envoi de fichiers PDF individualisés
à de nombreux utilisateurs. Par exemple, envoi de sujets d'examen à
des étudiants.
Attention, on peut vite se retrouver à spammer le serveur et les utilisateurs.
Réfléchir à 3 fois avant de lancer le script avec une longue liste de
destinataires !
Le script principal est mailing.py (nécessite Python 3).
La configuration est répartie entre les fichiers suivants :
- mailing.json : connexion au serveur, identité de l'expéditeur
- mailing.txt : sujet et corps du message qui accompagne la pièce-jointe
- mailing.csv : liste des destinataires et de leurs fichiers
Le script produit un fichier mailing.log qui permet de détecter les erreurs
d'envoi.
Lire mailing.txt pour en savoir davantage.
PS. Le code est non documenté et un affreux mélange de franglais
alice.demo@mailinator.com,104.pdf,sujet.pdf,Alice
bob.demo@mailinator.com,104.pdf,sujet.pdf,Bob
{
"server": "smtps.univ-orleans.fr",
"port": 465,
"login": "p29719",
"sender": "Nicolas Ollinger <Nicolas.Ollinger@univ-orleans.fr>"
}
2020-06-07 11:22:19,155 ==== Début du mailing ====
2020-06-07 11:22:19,394 alice.demo@mailinator.com: OK
2020-06-07 11:22:19,569 bob.demo@mailinator.com: OK
2020-06-07 11:22:19,576 ==== Fin du mailing ====
#!/usr/bin/env python
from smtplib import SMTP_SSL
from getpass import getpass
from email.message import EmailMessage
from email.utils import formatdate
import csv, logging, json
with open('mailing.txt') as f:
sujet=f.readline().strip()
texte=f.read(-1)
with open('mailing.json') as f:
conf=json.load(f)
if 'passwd' not in conf:
conf['passwd']=getpass()
def envoie(serveur,port,login,mdp,sujet,corps,emet,dest,pdf_path,filename):
msg=EmailMessage()
msg['Subject']=sujet
msg['From']=emet
msg['To']=dest
msg["Date"] = formatdate(localtime=True)
msg.set_content(corps)
with open(pdf_path,'rb') as f:
dapdf=f.read(-1)
msg.add_attachment(dapdf, maintype='application', subtype='pdf', filename=filename)
with SMTP_SSL(serveur,port) as server:
server.login(login,mdp)
try:
server.send_message(msg)
logging.info('{}: OK'.format(dest))
except Exception as e:
logging.error('{} : {}'.format(dest,str(e)))
print('ERROR ON {}'.format(dest))
logging.basicConfig(filename='mailing.log',level=logging.DEBUG,format='%(asctime)s %(message)s')
logging.info('==== Début du mailing ====')
with open('mailing.csv',newline='') as f:
reader=csv.reader(f)
for row in reader:
print('{}...'.format(row[0]))
envoie(conf['server'],conf['port'],conf['login'],conf['passwd'],sujet,texte.format(*row[3:]),conf['sender'],row[0],row[1],row[2])
logging.info('==== Fin du mailing ====')
Cette ligne contient le sujet du message
Cher {},
Voici un exemple d'envoi automatisé de fichiers PDF.
La configuration du script (serveur d'envoi, login, mot de passe, adresse de l'émetteur) se fait
dans le fichier mailing.json. Le sujet et le corps du message sont à placer dans le fichier
mailing.txt. Enfin, le fichier mailing.csv contient, au format CSV, les informations suivantes :
- adresse du destinataire ;
- chemin d'accès au fichier PDF à attacher au message ;
- nom associé au fichier PDF dans le message ;
- autant d'éléments que nécessaires pour remplir les champs variables du corps du message.
Lors de l'exécution de mailing.py, si le fichier de configuration ne contient pas le champ passwd,
l'utilisateur est invité à entrer son mot de passe. Sinon ce dernier est extrait du fichier de
configuration.
Pour chaque entrée du fichier CSV, une nouvelle connexion au serveur SMTP est créée. Le résultat
de l'envoi est loggué dans mailing.log. En cas d'erreur, un message est affiché dans la console.
Bon courage,
Robot mailer fou
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment