Synchroniser Galette et Mailman pour gérer la liste de diffusion d’une association

Galette est un outil très pratique pour gérer les adhérents d’une association.

Mailman est un autre outil très pratique pour gérer une mailing-list.

Il peut donc être intéressant de synchroniser les deux pour que chaque adhérent ajouté dans Galette soit automatiquement abonné à la mailing-list de l’association.

Principe :

Un script récupère dans la base de données de Galette l’ensemble des adresses e-mail des adhérents. Il teste ensuite si ces adresses ont déjà été abonnées à la mailing-list, et abonne celles qui ne l’on jamais été.

Ce script est exécuté chaque nuit à l’aide de cron.

Notes :

Plutôt que de tester si l’adresse est déjà abonnée à la liste, j’utilise un fichier intermédiaire, pour plusieurs raisons :
- D’un point de vue rapidité d’exécution, c’est certainement meilleur.
- Ça m’éviter de chercher comment tester l’existence d’une adresse dans une liste Mailman…
- Et surtout, si quelqu’un décide de se désabonner lui-même de Mailman, ce qui est son droit, cette méthode évite que le script le réabonne bêtement la nuit suivante !

Dans mon cas, la liste que je gère avec Mailman n’a pas pour vocation d’être une liste de discussion mais une simple liste d’information. Par conséquent, mon script met en place immédiatement la modération sur chaque adresse abonnée, afin que les adhérents n’envoient pas (souvent par erreur) un mail à toute la liste.

Mise en œuvre :

1. Ajout d’un code python permettant de modérer la liste depuis la ligne de commande.

Cette étape n’est nécessaire que si votre liste est une simple liste d’information. Si vous souhaitez, au contraire, que vos adhérents discutent entre eux sur la liste, passez à l’étape 2.

Créez le fichier du.py dans le répertoire de Mailman. Sous Debian, il s’agit de /usr/lib/mailman/bin.

Collez dans ce fichier le code suivant, que j’ai trouvé ici :

# DU mailman Modules
# This should live in the base Mailman install directory to be seen by the withlist Mailman binary.

from Mailman import mm_cfg
from Mailman.Errors import NotAMemberError

# Set a member's moderator flag to on or off
# e.g. to disable moderation: setMemberModeratedFlag listname, email_address, ''
def setMemberModeratedFlag (mlist, addr, mod):
#               print "Setting moderator flag to ",mod," for ",addr
                mlist.setMemberOption (addr, mm_cfg.Moderate, mod)
                mlist.Save()
# Error checking would be nice as soon as I get the syntax right.

# Fix an issue where a newly created mailing list sends emails to the list admin
# about "-1 pending requests" because a requests python pickle does not yet exist.
# BY querying the list for the number of requests pending, this file will get created.
def fixNegativePendingRequests (mlist):
        klugevar=mlist.NumRequestsPending()
        mlist.Save()

2. Création du script de synchronisation

Créez un premier fichier qui servira au stockage temporaire des adresses.

Par exemple: /home/asso/scripts/liste_adherents_asso.

Mettez dedans ceci :

email_adh

et rien d’autre.

(Cette chaîne de caractères est renvoyée par la requête SQL avant les adresses. Le fait de la mettre ici nous évite d’avoir à la gérer.)

Ensuite, créez un fichier qui sera votre script proprement dit.

Par exemple : /home/asso/scripts/synchro_galette_mailman.sh

Mettez dedans le code suivant :

#!/bin/sh

# Script qui synchronise les adresses e-mail de la base de donnees de Galette avec une liste mailman
# Note : le script utilise un fichier texte intermediaire, ce qui permet :
# - d'eviter de reabonner qqun qui est dans galette mais qui se serait desabonne via l'interface de mailman
# - de connaitre chaque jour les nouvelles adresses qui viennent d'etre abonnees (surveillance du fonctionnement)

# Requete qui selectionne toutes les adresses e-mail des adherents actifs dans Galette
REQUETE="select email_adh from galette_adherents where activite_adh='1' and email_adh != '';"

# Identifiant d'access a la BDD de Galette
MYSQL_LOGNAME="identifiant_de_la_base_de_galette"
# Mot de passe d'acces a la BDD de Galette
MYSQL_PASSWD="mot_de_passe_de_la_base"
# Nom de la base de donnees de Galette
MYSQL_BDD="nom_de_la_base"

# Nom d'un fichier texte qui contient les adresses deja abonnees a mailman
# (avant la premier execution du script, creer ce fichier et ecrire dedans "email_adh" et rien d'autre)
FICHIER_ADRESSES="/home/asso/scripts/liste_adherents_asso"
# Nom de la mailing-list a synchroniser
MAILMAN_LIST="asso-informations"

# On enleve le fichier texte d'abonnes datant d'avant la synchro precedente
rm "$FICHIER_ADRESSES".old
# On sauvegarde le fichier teste des abonnes actuels
cp "$FICHIER_ADRESSES" "$FICHIER_ADRESSES".old
# On execute la requete, et pour chaque ligne de son resultat (= chaque adresse e-mail de la base)
# on verifie que l'adresse est absente du fichier texte
# et si c'est le cas on l'ajoute a la mailing-list et au fichier texte
# et on ajoute le flag de moderation pour que la personne ne puisse pas poster sur la liste
echo "$REQUETE" | mysql -u "$MYSQL_LOGNAME" -p"$MYSQL_PASSWD" "$MYSQL_BDD" | while read ligne; do if [ "$(grep $ligne $FICHIER_ADRESSES)" = "" ] ; then echo $ligne | tee -a "$FICHIER_ADRESSES" | /usr/sbin/add_members -r - "$MAILMAN_LIST" ; /usr/sbin/withlist -l -r du.setMemberModeratedFlag "$MAILMAN_LIST" "$ligne" 'x' ; fi ; done
echo "Adresses ajoutees : " $(diff "$FICHIER_ADRESSES" "$FICHIER_ADRESSES".old)

Bien sûr, les valeurs en rouge sont à remplacer par les votres.

Encore une fois, le script est fait pour une liste d’information, donc modérée. Si votre liste est une liste de discussion, supprimez la partie en bleu (soyez précis).

Le script ne fonctionnera pas si vous n’avez pas suivi l’étape 1 et que vous ne faites pas cette suppression.

3. Automatisation avec cron

Tapez crontab -e. Je vous laisse chercher comment cela fonctionne si vous ne connaissez pas.

Ajoutez la ligne suivante :

0 4 * * * /home/asso/scripts/synchro_galette_mailman.sh

Ou, si comme moi vous souhaitez être informé par mail du déroulement :

0 4 * * * /home/asso/scripts/synchro_galette_mailman.sh | mail -s "Resultat de la synchro" votre_adresse_mail
2 4 * * * cat /home/asso/scripts/liste_adherents_asso | mail -s "liste d adresses" votre_adresse_mail

Sauvegardez. Un message vous dit que le nouveau crontab est installé. Dorénavant, votre synchronisation aura lieu chaque nuit à 4h.

 

Ce contenu a été publié dans Astuces, Informatique, Internet. Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Synchroniser Galette et Mailman pour gérer la liste de diffusion d’une association

  1. jean-luc dit :

    est ce que ce scipt prend en compte les adhérents attahcé dans galette (c’est dire ceux qui n’ont pas de mail mais bénéficient de celui qui est soécifié dans le compte de rattachement).

    C’est notre cas dans beaucoup de famille où nous avons le même mail pour tous les membres (mais galette refuse les doublons de mails d’où l’utilisation du rattachement).

    Cordialement, Jean-luc

    • Adrien dit :

      Regardez la requête : SELECT email_adh FROM galette_adherents WHERE activite_adh=’1′ AND email_adh !=  »; »

      Le script prend chaque adresse e-mail présente dans la base de données des adhérents. Peu importe que le compte soit lié à un autre ou pas.

      Si deux comptes sont attachés ensemble, et qu’un seul des deux possède une adresse mail, alors l’adresse en question sera abonnée une et une seule fois.

      (Et de toute façon, Mailman n’aurait pas laissé une adresse s’abonner en double.)

Répondre à Adrien Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>