Si vous avez recompilé vous même postfix, le support de postgreSQL n'est pas activé par défaut. Si vous avez installé postfix à l'aide de votre gestionnaire de paquetage, le support de postgreSQL n'est peut-être pas présent. Pour le vérifier:
root@zipslack:~# postconf -m btree cidr environ hash nis proxy regexp static unixNous pouvons voir que postfix n'a pas le support de postgreSQL. Il suffit de modifier les Makefile de postfix, et de recompiler. Si nous considérons que les sources de postfix sont sous /usr/src/postfix-2.2.3/ et que les librairies de postgreSQL sont sous /usr/local/pgsql/lib, nous ferons:
make tidy
make -f Makefile.init makefiles \
'CCARGS=-DHAS_PGSQL -I/usr/local/pgsql/include' \
'AUXLIBS=-L/usr/local/pgsql/lib -lpq'
make
su
make upgrade
Si vous revérifiez la configuration de postfix, vous verrez bien apparaître
# postconf -m btree cidr environ hash nis pgsql <----le support de postgreSQL est actif proxy regexp static unixIl est possible maitenant de spécifier à postfix des listes à chercher sous la forme:
/etc/postfix/main.cf:
parametre_maps = pgsql:/etc/postfix/parametre.cf
Nous verrons par la suite la forme des fichiers pgsql.cf
Il faut maintenant spécifier à postfix qu'il doit accepter des mails
pour le nouveau domaine, et qu'il doit le délivrer à ces utilisateurs
virtuels.
-attention- certains tests peuvent laisser postfix dans un
état instable, il est très déconseillé des les effectuer sur un serveur
en production! i la base postgreSQL n'est pas joignable,
postfix spoolera les mails en attendant de retrouver la connection
avec la base, même pour les domaines locaux! A partir du moment
ou un paramètre pgsql:/ est présent dans le main.cf, vous devez
avoir une base postgreSQL joignable. Si la base postgreSQL n'est
pas joignable, postfix spoolera les mails en attendant de
retrouver la connection avec la base, même pour les domaines locaux!
Soit le fichier main.cf de postfix, j'ajoute à la fin:
(...) # domaines virtuels virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-domaine.cf virtual_mailbox_base = /var/spool/vhosts/ virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-boites.cf virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_alias_maps = pgsql:/etc/postfix/pgsql-alias.cfN'oubliez de relancer postfix par un postfix reload après chaque modification de son main.cf.
postconf | grep ^virtual_montre près de 25 occurences. Rapportez vous au manuel de postfix pour plus d'informations.
N'oubliez pas de créer le virtual_mailbox_base:
root@zipslack:~# mkdir /var/spool/vhosts root@zipslack:~# chown 5000.5000 /var/spool/vhosts/
Les fichiers pgsql-*.cf comporteront tous la même structure (voir man 5 pgsql_table):
# # fichier de configuration pgsql type pour postfix # Les hôtes choisis successivement pour se connecter hosts = hote.domaine.tld hote2.domaine.tld 127.0.0.1 # Le nom d'utilisateur et le mot de passe user = utilisateur password = pw # Le nom de la base dbname = customer_database # Postfix 2.2 query = SELECT colonne FROM table WHERE colonne2='%s' AND drapeau='O'La syntaxe permet d'utiliser les drapeaux (voir le chapitre sur postgreSQL). Par exemple, si le drapeau contient la validité du compte (payé, non payé, compte ouvert, fermé, etc..).
hosts = 127.0.0.1 user = lecteur password = lire dbname = vmail query = SELECT nom_domaine FROM domaine WHERE nom_domaine='%s'
hosts = 127.0.0.1 user = lecteur password = lire dbname = vmail query = SELECT chemin||'/'||nom_boite||'/' AS path FROM boites JOIN domaine USING (nom_domaine) WHERE email='%s' AND boites.drapeau='O'
hosts = 127.0.0.1 user = lecteur password = lire dbname = vmail query = SELECT email FROM alias WHERE mail_alias='%s'
Nous allons tester la validité de ces expressions, et de l'adéquation avec postfix.
kevin@zipslack:~$ psql -U lecteur -h 127.0.0.1 vmail -c "SELECT chemin||'/'||nom_boite||'/' AS path FROM boites JOIN domaine USING (nom_domaine) WHERE email='kevin@boum.org'"
Mot de passe :
path
-----------------
boum.org/kevin/
(1 ligne)
L'utilisateur kevin@boum.org existe (puisque postgreSQL renvoie une réponse)
et ses mails seront rangés sous boum.org/kevin/ au format Maildir (grâce
au '/' final).
root@zipslack:~# postmap -q kevin@boum.org pgsql:/etc/postfix/pgsql-boites.cf boum.org/kevin/Cette réponse est bien en cohérence avec la requête SQL effectuée précedemment. postfix trouve une boite mail pour l'utilisateur kevin@boum.org.
root@zipslack:~# postmap -q boum.org pgsql:/etc/postfix/pgsql-domaine.cf boum.org root@zipslack:~# postmap -q all@boum.org pgsql:/etc/postfix/pgsql-alias.cf boum@boum.org,kevin@boum.org root@zipslack:~# postmap -q inconnu@boum.org pgsql:/etc/postfix/pgsql-boites.cf root@zipslack:~#
Vous ne devriez avoir aucun problème d'authentification aupès de la base SQL, ni de refus de postfix. Les utilisateurs référencés se voient retourner leur chemin ou ranger les emails à recevoir, les utilisateurs inexistants n'ont aucune réponse.
Pour tester le plus facilement possible l'envoi des mails, j'utiliserais telnet.
kevin@zipslack:~$ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 Postfix ESMTP mail server on linux helo zipslack 250 zipslack.local.tux mail from: kevin@zipslack.local.tux 250 Ok rcpt to: kevin@boum.org 250 Ok data 354 End data withLes logs me montrent:. bonjour . 250 Ok: queued as E88D627F3 quit 221 Bye Connection closed by foreign host. kevin@zipslack:~$
Aug 30 12:40:02 zipslack postfix/smtpd[6430]: connect from localhost[127.0.0.1] Aug 30 12:40:26 zipslack postfix/smtpd[6430]: E88D627F3: client=localhost[127.0.0.1] Aug 30 12:40:32 zipslack postfix/cleanup[6437]: E88D627F3: message-id=<20050830104018.E88D627F3@zipslack.local.tux> Aug 30 12:40:32 zipslack postfix/qmgr[6340]: E88D627F3: from=Et le mail est bien arrivé dans le format Maildir:, size=339, nrcpt=1 (queue active) Aug 30 12:40:32 zipslack postfix/virtual[6440]: E88D627F3: to= , relay=virtual, delay=14, status=sent (delivered to maildir) Aug 30 12:40:32 zipslack postfix/qmgr[6340]: E88D627F3: removed Aug 30 12:40:36 zipslack postfix/smtpd[6430]: disconnect from localhost[127.0.0.1]
root@zipslack:~# ls -l /var/spool/vhosts/boum.org/kevin/ total 3 drwx------ 2 5000 5000 1024 aoû 30 12:40 cur/ drwx------ 2 5000 5000 1024 aoû 30 12:40 new/ drwx------ 2 5000 5000 1024 aoû 30 12:40 tmp/
Vous pouvez faire le test avec un alias comme all@boum.org, un autre mail valide, un utilisateur inconnu, postfix réagira comme attendu.
-rw-r----- 1 root postfix 181 sep 6 16:09 /etc/postfix/pgsql-boites.cf