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.

Vus : 1574
Publié par Michauko : 64