Table des matières

Configurer Postfix

Pour Postfix, ça va être un peu plus compliqué. Nous avons vu jusqu'ici des configurations assez simples de Postfix, principalement grâce à ses paramètres par défaut. La liste des paramètres de Postfix est assez impressionnante. Pour s'en convaincre, un postconf montrera tous ces paramètres, avec leurs valeurs par défaut si elles n'ont pas été surchargées dans main.cf. Il y a actuellement pas moins de 525 paramètres…

Nous allons surtout nous intéresser aux paramètres spécifiques à la configuration « virtuelle ». En effet Postfix est conçu pour gérer les domaines virtuels. Il n'y a que 15 paramètres spécifiques, qui commencent tous par le mot virtual :

virtual_alias_domains = $virtual_alias_maps
virtual_alias_expansion_limit = 1000
virtual_alias_maps = $virtual_maps
virtual_alias_recursion_limit = 1000
virtual_destination_concurrency_limit = $default_destination_concurrency_limit
virtual_destination_recipient_limit = $default_destination_recipient_limit
virtual_gid_maps = 
virtual_mailbox_base = 
virtual_mailbox_domains = $virtual_mailbox_maps
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl
virtual_mailbox_maps = 
virtual_minimum_uid = 100
virtual_transport = virtual
virtual_uid_maps = 

Postfix et MySQL

Pour que Postfix puisse causer à MySQL et réciproquement, il y a plusieurs choses à faire :

Les requêtes SQL

Tout d'abord, il faut installer le paquet postfix-mysql

aptitude install postfix-mysql

Ensuite, il faut rédiger des fichiers qui permettront à Postfix d'interroger MySQL sur les domaines, les alias et les boites aux lettres qu'il a en charge.

Les domaines virtuels

Dans la table domains nous avons la liste des domaines virtuels à gérer. Postfixadmin prévoit divers drapeaux :

l> select * from domain;
+------------+----------------+---------+-----------+----------+-------+-----------+----------+---------------------+---------------------+--------+
| domain     | description    | aliases | mailboxes | maxquota | quota | transport | backupmx | created             | modified            | active |
+------------+----------------+---------+-----------+----------+-------+-----------+----------+---------------------+---------------------+--------+
| ALL        |                |       0 |         0 |        0 |     0 | NULL      |        0 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |      1 | 
| nain-t.net | Domaine public |       0 |         0 |        0 |     0 | virtual   |        0 | 2008-07-15 16:15:31 | 2008-07-15 16:15:31 |      1 | 
+------------+----------------+---------+-----------+----------+-------+-----------+----------+---------------------+---------------------+--------+

Nous créons un fichier /etc/postfix/db/mysql_virtual_domains_maps.cf qui permettra à Postfix d'interroger MySQL sur ce point et qui sera de la forme :

user = vmail      
password = epikoi        
hosts = localhost
dbname = vmail  
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

Les alias

De la même manière, créons un fichier /etc/postfix/db/mysql_virtual_alias_maps.cf dont le contenu sera le suivant :

user = vmail  
password = epikoi
hosts = localhost
dbname = vmail  
query = SELECT goto FROM alias WHERE address='%s' and active = '1'

Les boites aux lettres

Enfin, les chemins d'accès aux répertoires Maildir. Un fichier /etc/postfix/db/mysql_virtual_mailbox_maps.cf :

user = vmail  
password = epikoi        
hosts = localhost
dbname = vmail  
query = SELECT CONCAT(maildir, 'Maildir/') FROM mailbox WHERE username='%s' and active = '1'

le proxy de Postfix

Le service proxy de Postfix s'utilise assez simplement. Il faut cependant l'informer des lectures de paramètres qu'il doit prendre en charge. Commençons par voir quelle est sa configuration par défaut :

proxy_read_maps = $local_recipient_maps,
   $mydestination,
   $virtual_alias_maps,
   $virtual_alias_domains,
   $virtual_mailbox_maps,
   $virtual_mailbox_domains,
   $relay_recipient_maps,
   $relay_domains,
   $canonical_maps,
   $sender_canonical_maps,
   $recipient_canonical_maps,
   $relocated_maps,
   $transport_maps $mynetworks

Nous allons donc maintenant modifier dans /etc/postfix/main.cf les trois paramètres qui nous concernent :

virtual_alias_maps = proxy:mysql:/etc/postfix/db/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/db/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/db/mysql_virtual_mailbox_maps.cf

Sans oublier les UID et GID de l'utilisateur vmail :

virtual_minimum_uid = 500
virtual_uid_maps = static:500
virtual_gid_maps = static:500

Ni la partie commune du chemin d'accès aux Maildirs :

virtual_mailbox_base = /home/virtual/mail

Vérification

Nous allons utiliser l'agent de livraison virtual de Postfix pour faire un essai. C'est possible avec Dovecot. virtual est même capable de créer un Maildir qui n'existe pas encore.

Nous envoyons un message à sysop@nain-t.net :

~# mail sysop@nain-t.net
Subject: test postfix virtuel
c'est bon
.
Cc: 

Tout en observant les logs :

Jul 16 10:29:02 cyrus postfix/pickup[2953]: F186C4006BF: uid=0 from=<root>
Jul 16 10:29:02 cyrus postfix/cleanup[2982]: F186C4006BF: message-id=<20080716082901.F186C4006BF@cyrus.nain-t.net>
Jul 16 10:29:02 cyrus postfix/qmgr[2954]: F186C4006BF: from=<root@cyrus.nain-t.net>, size=320, nrcpt=1 (queue active)
Jul 16 10:29:05 cyrus postfix/smtpd[2990]: connect from localhost[127.0.0.1]
Jul 16 10:29:05 cyrus postfix/smtpd[2990]: 609494012E5: client=localhost[127.0.0.1]
Jul 16 10:29:05 cyrus postfix/cleanup[2982]: 609494012E5: message-id=<20080716082901.F186C4006BF@cyrus.nain-t.net>
Jul 16 10:29:05 cyrus postfix/smtpd[2990]: disconnect from localhost[127.0.0.1]
Jul 16 10:29:05 cyrus amavis[2137]: (02137-02) Passed CLEAN, <root@cyrus.nain-t.net> -> <sysop@nain-t.net>, Message-ID: <20080716082901.F186C4006BF@cyrus.nain-t.net>, mail_id: z4aQN+eLCjhF, Hits: 0.43, queued_as: 609494012E5, 3384 ms
Jul 16 10:29:05 cyrus postfix/smtp[2986]: F186C4006BF: to=<sysop@nain-t.net>, relay=127.0.0.1[127.0.0.1]:10024, delay=3.6, delays=0.21/0.03/0.01/3.4, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=02137-02, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 609494012E5)
Jul 16 10:29:05 cyrus postfix/qmgr[2954]: F186C4006BF: removed
Jul 16 10:29:05 cyrus postfix/qmgr[2954]: 609494012E5: from=<root@cyrus.nain-t.net>, size=763, nrcpt=1 (queue active)
Jul 16 10:29:05 cyrus postfix/virtual[2992]: 609494012E5: to=<sysop@nain-t.net>, relay=virtual, delay=0.31, delays=0.15/0.07/0/0.08, dsn=2.0.0, status=sent (delivered to maildir)
Jul 16 10:29:05 cyrus postfix/qmgr[2954]: 609494012E5: removed

Et nous devons retrouver le message à sa place :

:~# cd /home/virtual/mail/nain-t.net/sysop/Maildir/new/
cyrus:/home/virtual/mail/nain-t.net/sysop/Maildir/new# ls
1216196945.V305I3400083M657329.cyrus
cyrus:/home/virtual/mail/nain-t.net/sysop/new# cat 1216196945.V305I3400083M657329.cyrus 
Return-Path: <root@cyrus.nain-t.net>
X-Original-To: sysop@nain-t.net
Delivered-To: sysop@nain-t.net
Received: from localhost (localhost [127.0.0.1])
	by cyrus.nain-t.net (Postfix) with ESMTP id 609494012E5
	for <sysop@nain-t.net>; Wed, 16 Jul 2008 10:29:05 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at cyrus.nain-t.net
Received: from cyrus.nain-t.net ([127.0.0.1])
	by localhost (cyrus.nain-t.net [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id z4aQN+eLCjhF for <sysop@nain-t.net>;
	Wed, 16 Jul 2008 10:29:02 +0200 (CEST)
Received: by cyrus.nain-t.net (Postfix, from userid 0)
	id F186C4006BF; Wed, 16 Jul 2008 10:29:01 +0200 (CEST)
To: sysop@nain-t.net
Subject: test postfix virtuel
Message-Id: <20080716082901.F186C4006BF@cyrus.nain-t.net>
Date: Wed, 16 Jul 2008 10:29:01 +0200 (CEST)
From: root@cyrus.nain-t.net (root)

c'est bon

Transport dovecot

Le transport virtual fonctionne, mais avec, nous perdons quelques fonctionnalités propres à Dovecot :

Dovecot, nous l'avons vu dans le chapitre précédent, propose l'outil /usr/lib/dovecot/deliver. Cet outil peut être aussi bien utilisé pour le transport local que pour le transport virtuel. Il n'est d'ailleurs pas inutile et même conseillé de lire la documentation de Dovecot à ce sujet, ainsi que son intégration avec Postfix

Nous ajoutons donc dans /etc/postfix/master.cf les lignes suivantes :

#
# Dovecot deliver
#
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

Et dans /etc/postfix/main.cf :

# Virtual transport Dovecot
dovecot_destination_recipient_limit = 1
virtual_transport = dovecot

Nous demandons à Postfix de recharger sa configuration avec un postfix reload des familles et nous essayons :

# mail sysop@nain-t.net
Subject: test transport virtuel dovecot
c'est encore bon
.
Cc: 

Les logs :

Jul 16 11:07:13 janus postfix/pickup[3029]: C59184006BF: uid=0 from=
Jul 16 11:07:13 janus postfix/cleanup[3076]: C59184006BF: message-id=<20080716090713.C59184006BF@janus.nain-t.net>
Jul 16 11:07:13 janus postfix/qmgr[3030]: C59184006BF: from=, size=337, nrcpt=1 (queue active)
Jul 16 11:07:15 janus postfix/smtpd[3083]: connect from localhost[127.0.0.1]
Jul 16 11:07:15 janus postfix/smtpd[3083]: 74FAA4000B3: client=localhost[127.0.0.1]
Jul 16 11:07:15 janus postfix/cleanup[3076]: 74FAA4000B3: message-id=<20080716090713.C59184006BF@janus.nain-t.net>
Jul 16 11:07:15 janus postfix/qmgr[3030]: 74FAA4000B3: from=, size=780, nrcpt=1 (queue active)
Jul 16 11:07:15 janus amavis[2137]: (02137-03) Passed CLEAN,  -> , Message-ID: <20080716090713.C59184006BF@janus.nain-t.net>, mail_id: TmCa1TrEXu4h, Hits: 0.626, queued_as: 74FAA4000B3, 1732 ms
Jul 16 11:07:15 janus postfix/smtp[3079]: C59184006BF: to=, relay=127.0.0.1[127.0.0.1]:10024, delay=2, delays=0.17/0.03/0.01/1.7, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=02137-03, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 74FAA4000B3)
Jul 16 11:07:15 janus postfix/qmgr[3030]: C59184006BF: removed
Jul 16 11:07:15 janus postfix/smtpd[3083]: disconnect from localhost[127.0.0.1]
Jul 16 11:07:15 janus deliver(sysop@nain-t.net): msgid=<20080716090713.C59184006BF@janus.nain-t.net>: saved mail to INBOX
Jul 16 11:07:15 janus postfix/pipe[3084]: 74FAA4000B3: to=, relay=dovecot, delay=0.26, delays=0.09/0.02/0/0.15, dsn=2.0.0, status=sent (delivered via dovecot service)
Jul 16 11:07:15 janus postfix/qmgr[3030]: 74FAA4000B3: removed

Le message est remis, avec dovecot, cette fois-ci, pour la livraison virtuelle.