postfix, utilisateurs virtuels et appels à procmail
Hello,
Dans un précédent article, j’avais expliqué comment faire en sorte qu’une installation postfix/amavis/…/mysql – avec donc des domaines et des utilisateurs virtuels – puisse faire appeler « procmail » afin de passer le relai à « vacation », l’outil de répondeur automatique d’absence.
Depuis, j’ai trouvé plus élégant pour passer des règles plus complètes à procmail (quitte à envoyer à vacation ensuite). C’est juste beaucoup plus joli et mieux construit. J’explique – toujours en partant d’une conf postfix/amavis/mysql comme celle que je décris dans des précédents articles.
Principe
On va créer une voie de transport dans postfix afin de « router » les messages de certains utilisateurs vers un pipe particulier appelant procmail dans sa forme à peu près basique.
« procmail » tournera au nom de l’utilisateur gérant les « Maildir » virtuels, utilisateur « vmail » (dans mes docs précédentes) et lira un procmail général avant de passer le relai à un procmail par utilisateur (si besoin), pour trier. En décrivant proprement l’environnement pour procmail, on livrera où il faut dans un Maildir sous « vmail », donc dans un Maildir d’un domain virtuel pour un utilisateur virtuel dans un sous-répertoire de sa boîte Maildir.
Mouais, bon, c’est pas hyper clair, mais ça va le devenir
pipe postfix
Dans /etc/postfix/master.cf
, on déclare le « pipe suivant » :
procmailpipe unix - n n - 10 pipe flags=ROq user=vmail argv=/usr/bin/procmail --m USER=${user} EXTENSION=${extension} NEXTHOP=${nexthop} /etc/postfix/procmail.global.rc
Bien noter le « NEXTHOP » qui nous indiquera le domaine (pratique lorsqu’on en gère plusieurs en virtuel.
Je rappelle que dans ma conf, l’utilisateur hébergeant les boites mails est « vmail », dont le home est /vmailboxes/
. On trouve donc là-dedans des répertoires comme /vmailboxes/mon_domaine.com/mon_user/cur|tmp|new
et autres sous répertoires commençant par .sous-rep/[cur|new|tmp]/
.
Pour accompagner le flag « O » dans ce pipe, la doc postfix indique de bien positionner dans le /etc/postfix/main.cf
:
procmailpipe_destination_recipient_limit = 1
Alias d’un utilisateur vers son procmail
Dans mes tables SQL (à priori « transport » et « forwardings »), j’indique ceci :
transport : procmail.mon_domaine.com => procmailpipe forwardings : mon_user@mon_domaine.com => mon_user@procmail.mon_domaine.com
Ainsi, un mail arrive à mon_user@mon_domaine.com suivra vers mon_user@procmail.mon_domaine.com (qui n’existe pas au sens DNS) et sera donc routé vers le « pipe » postfix nommé « procmailpipe » décrit dans master.cf
.
procmailrc global
Le « pipe » postfix ira lire /etc/postfix/procmail.global.rc
en passant quelques variables comme on l’a vu.
Dans ce fichier, on trouve exactement ça :
serveur:~# cat /etc/postfix/procmail.global.rc SHELL=/bin/sh MAILDIR="$HOME/$NEXTHOP/$USER" DEFAULT="$MAILDIR/" #VERBOSE=ON #LOGFILE="$HOME/procmail/$NEXTHOP.$USER.log" NL=" " WS=" " SWITCHRC="$HOME/procmail/$NEXTHOP.$USER.rc"
Pour NL et WS, c’est une question de séparateur de mot, de ligne etc. (je crois )
Pour VERBOSE et LOGFILE, vous activerez au début quand ça ne fonctionnera pas, afin de pouvoir déverminer.
Toute la beauté du bazar réside en fait dans le « MAILDIR » et « SWITCHRC ».
Dans mon exemple, MAILDIR vaudra :
$HOME = home de vmail = /vmailboxes
$NEXTHOP = procmail.mon_domaine.com
$USER = mon_user
Enfin, on ira lire un fichier procmailrc par utilisateur. Si on ne trouve pas de fichier « /vmailboxes/procmail/procmail.mon_domaine.com.mon_user.rc
« , on finira donc directement dans une MAILDIR nommée « /vmailboxes/procmail.mon_domaine.com/mon_user/
» (attention au « / » de fin dans DEFAULT pour indiquer un format Maildir et pas mailbox). Presque parfait me direz-vous car dans mes domaines virtuels hébergés, j’avais prévu « /vmailboxes/mon_domaine.com
» et pas « procmail.mon_domaine
« .
Je n’ai pas trouvé de variable type NEXTHOP rappelent le domaine d’origine. Par contre un lien symbolique de « /vmailboxes/procmail.mon_domaine.com/
» vers « /vmailboxes/mon_domaine.com/
» règle joliment le problème.
Enfin, procmailrc par utilisateur
J’ai donc regroupé mes différents procmailrc dans /vmailboxes/procmail/
Ces fichiers contiendront donc des règles procmail habituelles, en considérant pour « MAILDIR/DEFAULT » de travail, qu’on est bien placé dans « /vmailboxes/[procmail.]mon_domaine.com/mon_user/
« . Ainsi :
:0 * Subject:.*testprocmail .test/
…ira bien placer votre mail dans le sous-répertoire « test » de l’utilisateur. Donc dans « /vmailboxes/mon_domaine.com/mon_user/.test/new/
»
Débuggage
Pendant la phase de tests, notez que les mails allant dans des Maildir n’existant pas finiront dans le home de l’utilisateur « vmail ». Donc, vous verrez peut-être apparaître /vmailboxes/[cur|new|tmp]
et pourrez aller à la pêche.