postfix, utilisateurs virtuels et appels à procmail

closeCet article a été publié il y a 8 ans 13 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

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.

6 réflexions au sujet de « postfix, utilisateurs virtuels et appels à procmail »

  1. indl

    bonjour,
    le tuto est interessant mais je le trouve très compliqué !!
    j’essais de mettre en place la même config mais avec des utilisateurs virtuel via userdb, auriez vous quelques conseils car je bloque, mon procmail n’est pas pris en compte, j’ai essayé de mixer différente informations que je trouve sur internet mais ce ca ne fonctionne pas.
    merci

    Répondre
    1. michauko Auteur de l’article

      Salut,
      Compliqué, c’est relatif 🙂 Ce présent article est plutôt simple, mais il repose sur toute une conf plus longue à mettre en place, en effet.
      Ca pour monter le tout : http://michauko.org/blog/2009/09/21/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc/
      Puis pour récupérer les mails (IMAP, POP) : http://michauko.org/blog/2009/10/20/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre/
      Celui-ci pour commencer à jouer avec les procmail dans le cas d’une conf d’utilisateurs virtuels (userdb ou postfix, même combat je pense) : http://michauko.org/blog/2010/06/16/utilisateurs-postfix-virtuels-ajouter-un-repondeur-vacation/
      Et enfin ce présent article.

      C’est long pour tout mettre en place, ça d’accord

      Avec userdb, ça ne doit pas changer énormément de trucs je suppose. Après sans plus de détail, je ne peux pas dire.

      Répondre
  2. indl

    bonjour, merci de votre réponse, le dernier lien fourni ressemble fortement à ce que je cherche, mais je bloque tjrs sur la partie « transport virtuel », vous l’aborder avec une base sql, pour ma part j’utilise les fonction suivante pour mes utilisateurs virtuel :
    virtual_mailbox_domains = /etc/postfix/virtual_domains
    virtual_mailbox_maps = hash:/etc/postfix/vmailbox
    virtual_mailbox_base = /home/mail/vhosts
    virtual_alias_maps = hash:/etc/postfix/virtual

    je vois que tu utilise la fonction transport_maps, je devrais peu être l’utilisé, mais à quoi ressemble la syntaxe sachant que je ne suis pas sur du sql

    j’ai tenté de mettre en place cette config mais ca ne marche pas je pense qu’il manque des paramètre dans mon procmail.global et peu etre la fonction transport_maps pour postfix :

    ajouté à master.cf :
    procmailpipe unix – n n – 10 pipe
    flags=ROq user=vmail argv=/usr/bin/procmail –m USER=${user} EXTENSION=${exte
    nsion} NEXTHOP=${nexthop} /etc/postfix/procmail.global

    ajouté à main.cf :
    virtual_transport = procmailpipe:
    mailbox_transport = procmailpipe:

    ajouté à procmail.global :
    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 »

    Pouvez vous me conseiller sur ce qui est à modifier ?
    D’avance merci pour votre aide

    Répondre
  3. Joel

    Merci pour cette doc mais il y a une erreur : dans le main.cf, la configuration à mettre en place, étant donné que le transport s’appelle ici « procmailpipe », est :
    procmailpipe_destination_recipient_limit = 1
    (et pas « procmail_destination… »)

    Sans ça, à la réception d’un email multidestinataire avec du procmail derrière, ça ne passera pas.

    Répondre

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.