mailing list Python

Une mailing list en Python

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).

La publication a un commentaire

  1. 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 !

Laisser un commentaire