Accueil du site > Documentation > Mailman, postfix et VERP

Mailman, postfix et VERP

dimanche 11 janvier 2009, par Fil

Attention article démesurément technologique et barbant...

Le gestionnaire de mailing-lists Mailman (utilisé sur listes.rezo.net) sait traiter les messages d’erreur (« bounces ») que le serveur reçoit lorsqu’une des adresses email abonnées à une liste ne fonctionne plus. Le but est de désinscrire ces adresses afin de ne pas surcharger le serveur avec des emails abandonnés.

Une difficulté est que ces messages sont parfois ambigus :
- lorsque, par exemple, trois adresses sont fausses dans le même domaine, il arrive que ce domaine ne renvoie qu’un seul message d’erreur indiquant, dans un format non standardisé, les trois adresses ;
- autre exemple : lorsque l’adresse toto@domaine.tld est abonnée, mais que son propriétaire l’a redirigée vers toto2@un-autre.tld, et que cette seconde adresse est devenue fausse elle aussi, le serveur recevra une erreur de un-autre.tld sans avoir aucun moyen de deviner que c’est toto@domaine.tld qui en est la cause.

La solution à ce problème est le « chemin d’adresse de retour variable dans l’enveloppe », en anglais Variable Envelope Return Paths — VERP (ouf !) [1].

De quoi s’agit-il ? Le protocole SMTP dit qu’un email a le bon goût d’être entouré d’une enveloppe. Laquelle dit deux choses, et seulement deux :

  1. qui est l’émetteur : MAIL FROM: <emetteur@listes.tld>
  2. qui est (sont) le(s) destinataire(s). Une ou plusieurs ligne du type :
    RCPT TO: <destinataire1@domaine1.tld>
    RCPT TO: <destinataire2@domaine2.tld>

Le reste (sujet, contenu du message, pièces jointes, entêtes divers) se trouve « à l’intérieur » de l’enveloppe, après une commande DATA et, pour nos histoires, ne nous intéresse pas : le rôle du gestionnaire de mailing-liste (Mailman) est de créer le message, de le mettre dans la bonne enveloppe, et de donner cette enveloppe à l’« agent de transport » (Mail Transport Agent, MTA), en l’occurrence le serveur postfix, qui se charge alors d’envoyer l’enveloppe à son (ses) destinataire(s).

Traditionnellement, l’enveloppe d’un message émis depuis la liste test@rezo.net et destiné à toto@domaine.tld sera de la forme :

MAIL FROM: <test-bounces@rezo.net>
RCPT TO: <toto@domaine.tld>

Derrière l’adresse test-bounces réside un script qui reçoit les messages d’erreur de type « erreur de remise de message » (c’est-à-dire, dans le jargon du mail, les bounces).

Si on emploie VERP, l’enveloppe sera transformée de la manière suivante :

MAIL FROM: <test-bounces+toto=domaine.tld@rezo.net>
RCPT TO: <toto@domaine.tld>

On voit que les bounces de l’adresse toto@domaine.tld seront distribués de façon non ambigüe à test-bounces+toto=domaine.tld@rezo.net. Le script d’analyse des bounces saura donc avec certitude que ce message d’erreur est lié à l’adresse toto@domaine.tld, sans même avoir à lire le contenu du message d’erreur.

Ca, c’est pour VERP. Maintenant, l’énorme inconvénient de VERP est qu’il n’est plus possible de faire une seule enveloppe adressée à plusieurs destinataires. Or, lorsqu’on envoie un même mail sur une liste de plusieurs centaines de milliers de destinataires, il est utile de ne pas avoir à créer un message + une enveloppe par email, ne serait-ce que pour éviter de saturer le serveur.

Heureusement, postfix accepte qu’on lui donne un même message pour plusieurs destinataires dans une seule enveloppe, en le chargeant de produire lui-même les enveloppes VERP au moment où il se connecte aux serveurs des destinataires. Pour cela il faut que Mailman lui donne l’instruction XVERP au moment de l’envoi. C’est à ça que sert le patch suivant : http://lists.freebsd.org/pipermail/..., que l’on retrouve dans une version plus à jour en http://www.mail-archive.com/mailman....

Une fois ce patch appliqué aux fichiers Mailman/Defaults.py et Mailman/Handlers/SMTPDirect.py, il faut configurer Mailman (fichier ~mailman/Mailman/mm_cfg.py) de manière à ce qu’il l’utilise :

VERP_PROBES = Yes
VERP_PASSWORD_REMINDERS = Yes
VERP_PERSONALIZED_DELIVERIES = Yes
VERP_DELIVERY_INTERVAL = 1
VERP_CONFIRMATIONS = Yes
VERP_STYLE = 'Postfix'

Ajouter également à /etc/postfixmain.cf une ligne pour autoriser les clients locaux (en l’occurrence, Mailman), à exploiter l’extension XVERP :

smtpd_authorized_verp_clients=127.0.0.0/8

Dès lors les mails passent en « une seule enveloppe » [2] de Mailman vers postfix, lequel les émet ensuite en VERP vers les différents destinataires.

Notes

[2] En réalité, n enveloppes destinées chacune à un maximum de 500 destinataires.