Coin web de Frédéric Péters

fpeters@0d.be

Mailman3, listadmin, mechanize, etc.

19 janvier 2023, 15:23

La semaine dernière domaine public, l’hébergeur indépendant et autogéré où Radio Panik a ses emails, listes de discussion, etc. a fait la grosse mise à jour du service mailman, le service qui gère les listes de discussion, de la version 2 à la version 3. Ça n’a l’air de rien vu comme ça mais la version 2 est initialement sortie en 2001, a eu un tas de mises à jour puis tout a été refait pour donner Mailman 3 en 2015 et l’adoption ensuite a partout été très très lente, par exemple le projet GNOME a récemment abandonné ses listes de discussion, sans jamais avoir fait la mise à jour.

Bref je m’étais confortablement mis en tête que ça n’arriverait jamais, j’ai été pris par surprise, et le module d’abonnement à la newsletter de la radio n’était pas prêt.

Ce module utilise un outil, listadmin, qui rend très simple l’automatisation, dont la complexité est cachée derrière un seul appel en ligne de commande,

listadmin --add-member test@example.net newsletter-panik

Évidemment ce module gère uniquement mailman 2 et j’ai hésité deux secondes à écrire un outil qui se serait originalement appelé listadmin3 et aurait repris les mêmes paramètres mais je me suis vite raisonné, pas une bonne idée de partir sur un nouveau projet, et j’ai donc plutôt vu pour l’intégration directe et au plus simple.

Un moment j’ai cru qu’il y aurait des API pour rendre ça vraiment propre mais de ce que j’ai pu trouver les API de mailman 3 sont uniquement à usage interne, pas exposées, et il faut donc y aller de manière moche et se comporter comme l’utilisateur qui utilise un navigateur.

Heureusement pour ça il existe un module Python (mechanize) assez simple dans la mise en œuvre et avec un œil sur la documentation, en une dizaine de lignes (pas nécessairement très élégantes) c’était plié,

# emulate browser to login and subscribe user
br = mechanize.Browser()
br.open(settings.NEWSLETTER_MAILMAN3_LIST_URL)
br.follow_link(url_regex=re.compile('/accounts/login'))
br.select_form(action=lambda x: '/login/' in x)
br['login'] = settings.NEWSLETTER_MAILMAN3_LOGIN
br['password'] = settings.NEWSLETTER_MAILMAN3_PASSWORD
response = br.submit()
assert br.find_link(url_regex=re.compile('/accounts/logout'))
br.open(settings.NEWSLETTER_MAILMAN3_LIST_URL + 'mass_subscribe/')
br.select_form(action=lambda x: '/mass_subscribe/' in x)
br['emails'] = self.email
br['pre_confirmed'] = ['on']
br['pre_approved'] = ['on']
br['pre_verified'] = ['on']
br['send_welcome_message'] = ['False']
response = br.submit()

Ça se trouve dans le dépôt de django-panik-newsletter, c’est déployé sur le site, il ne reste plus qu’à trouver qui a les autorisations d’accès pour que je puisse terminer la configuration…

Bonne habitude gardée, ça a été l’occasion de documenter cette partie (configuration abonnement newsletter).