Comment créer une mailing list à l’aide de Python ? C’est la question que je me suis posée aujourd’hui.
J’utilise personnellement Thunderbird, et il permet de de créer des listes de diffusion… Cependant, il met en copie l’adresse mail de tous les autres destinataires. Cela ne me convient pas. Il m’a donc fallu faire quelques recherches.
\lire
Mailing list et Python: le client mail
La première chose sur laquelle se pencher est la façon d’envoyer un mail à l’aide de Python.
On va s’orienter du côté des modules smtp, ssl, MIMEText et MIMEMultipart.
import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart
Les informations de connexion
Il faut bien entendu informer l’adresse du serveur mail ainsi que le port, puis l’adresse mail que vous souhaitez utiliser pour envoyer les messages, ainsi que le mot de passe de cet email.
smtp_address = 'ssl0.ovh.net' smtp_port = 465 email_address = 'jean.neymar@free.fr' email_password = 'blablabla?314' # ce n'est qu'un exemple hein ? email_destinataire = 'jeveuxdesvacances@moiaussi.com'
La construction du message
message = MIMEMultipart("alternative") # au cas où le destinataire ne saurait pas lire le HTML message["Subject"] = "La rentrée scolaire est là... et moi aussi!" message["From"] = email_address message["To"] = email_destinataire texte = '''Bonjour. Le corps du message ici. Au revoir.''' html = ''' <html> <body> <h1>Bonjour.</h1> <p>Le corps du message ici.</p> <p>Au revoir.</p> </body> </html>''' texte_mime = MIMEText(texte, 'plain') html_mime = MIMEText(html, 'html') message.attach(texte_mime) message.attach(html_mime)
Comme vous pouvez le voir, il faut envisager le pire, à savoir que le logiciel qui va recevoir le mail ne puisse pas lire le format HTML. C’est la raison pour laquelle on doit aussi écrire le texte en brut.
L’envoi du message
context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_address, smtp_port, context=context) as server: server.login(email_address, email_password) server.sendmail(email_address, email_destinataire, message.as_string())
Voilà! Si cela fonctionne, vous êtes prêt·e· pour passer à la suite.
Mailing list et Python: envoi de plusieurs messages
Vous le devinerez sûrement, mais cette partie est la plus simple puisqu’elle ne repose que sur une boucle. Il faut au préalable construire une liste contenant toutes les adresses mails, bien sûr!
À ce niveau, c’est à vous de construire votre boucle comme vous le souhaitez.
Si le message doit rester le même alors il peut être à l’extérieur de la boucle et seule l’adresse mail du destinataire pourra apparaître dans la boucle (avec la partie envoi bien sûr).
destinataires = [ 'xxx@xxx.fr' , 'yyy@xxx.com', ... ] context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_address, smtp_port, context=context) as server: server.login(email_address, email_password) for dest in destinataires: message["To"] = dest server.sendmail(email_address, dest, message.as_string())
Connexion à une base de données
Il se peut que les adresses mails soient stockées dans une base de données MySQL ou MariaDB.
Dans ce cas, il faudra se connecter à cette base de données. Pour MySQL, il y a le module mysql.connector et il y a une bonne documentation un peu partout.
Personnellement, j’utilise une base MariaDB (je ne sais même plus pourquoi… mais bon!)
Dans ce cas, on va utiliser le module mariadb.
import mariadb destinataires= [] try: conn = mariadb.connect( user="root", password="", host="localhost", database="coursparticuliers" ) cur = conn.cursor() cur.execute("SELECT email FROM clients WHERE actif=1") # requête de sélection des emails for nom,prenom,email in cur: liste.append( email ) except mariadb.Error as e: print(f"Error connecting to MariaDB Platform: {e}")
Ici, j’ai sélectionné les adresses mails des clients qui étaient encore “actifs” (et non les anciens), car ma table “clients” possède une colonne “actif” (booléen). Le critère de sélection est bien entendu à votre convenance…
Toute cette réflexion est venue lorsque je voulais envoyer un mail à tous les parents qui font appel à moi dans le cadre de mes cours particuliers (https://courspasquet.fr).
J’ai testé avec une adresse @gmx.fr, serveur SMTP ‘mail.gmx.com’ sur le port 465, cela fonctionne bien et ouvre de nombreuses possibilités. Merci !