Préparation et configuration de postfix.


Dans ce chapitre, nous allons voir comment recompiler postfix afin qu'il sache utiliser une base de données postgreSQL. Nous allons paramétrer postfix pour qu'il accepte des mails pour les domaines virtuels et qu'il le range dans les boîtes de ces utilisateurs virtuels (Il faut entendre "virtuel" comme "ne disposant pas d'un compte unix sur la machine". Nous testerons la bonne remise du courrier.
Je considère que votre installation de postfix est fonctionnelle, au moins pour la remise de courrier local et l'envoi de courrier. Tant que postfix ne fonctionne pas, ne commencez pas ce chapitre, vous vous éviterez bien de la sueur à essayer de comprendre pourquoi postfix refuse les mails.
Je vais insister très lourdement sur un point: n'installez pas de serveur de mail sur internet en open-relay !!! Si vous ne savez pas ce que cela signifie, commencez par lire de la documentation sur un serveur de mail, sur l'open-relay et sur le phénomène de SPAM.
N'installez jamais de serveur de mail en open-relay! Outre le fait de le transformer en relais de spam, votre serveur se fera très rapidement blacklister par tous les autres serveurs de l'internet, vous empechant ainsi d'envoyer du courrier légitime.
Vérifiez toujours avant d'installer un serveur de mail qu'il n'est pas ouvert en open-relay. Merci de votre attention.
  1. Recompilation de postfix

    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
    unix
    
    Nous 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
    unix
    
    Il 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
    [Note: pour mySQL, le principe est le même, utilisez:
    make -f Makefile.init makefiles \
    'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
    'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm'
    et la forme du fichier de recherche s'écrit:
    parametre_map = mysql:/etc/postfix/mysql-parametre.cf ]

  2. Configuration de postfix

    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.cf
    
    N'oubliez de relancer postfix par un postfix reload après chaque modification de son main.cf.
    Explications des champs:
    Il existe d'autres paramètres, pour les connaître:
    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..).
    Le %s de la requête (query) doit être entre simples apostrophes ' et correspond à la variable placée par postfix. Cette variable dépend donc du type de l'interrogation de postfix. Si postfix s'interroge sur la validité d'un domaine virtuel, regarde le paramètre virtual_mailbox_domains. Donc le %s sera un domaine, et la réponse devra être un domaine en cas d'existence, et rien en cas de non-existence. Idem pour les boîtes ou postfix donne une adresse email et veut le chemin d'une boîte aux lettres.

    Les query sont volontairement simplistes. Le point important concerne la requête pour les utilisateurs. Le '/' final est important. C'est ce '/' final qui indique à postfix d'utiliser le mode de rangement Maildir au lieu de mbox. Je le répète, si postfix voit une boîte aux lettres, par exemple /var/spool/vhosts/boum.org/kevin il utilisera le format mbox pour la remise de courrier. S'il voit /var/spool/vhosts/boum.org/kevin/ il utilisera le format Maildir.
    La condition AND boites.drapeau='O' n'a pas vraiment d'utilité dans cet exemple. Elle permet juste de tester l'efficacité et l'utilisation de ces drapeaux. Vous pourrez lors de vos test essayer différents cas de figures.
    [Note pour mySQL. Il faut utiliser le mot clé CONCAT au lieu de || pour concaténer des informations lors des requêtes. Voir le man 5 mysql_table ]
  3. Premiers tests

    Nous allons tester la validité de ces expressions, et de l'adéquation avec postfix.

    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.

  4. Premiers envois de mail

    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 with .
    bonjour
    .
    250 Ok: queued as E88D627F3
    quit
    221 Bye
    Connection closed by foreign host.
    kevin@zipslack:~$
    
    Les logs me montrent:
    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=, 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]
    
    Et le mail est bien arrivé dans le format Maildir:
    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.

  5. Remarques


Postfix accepte donc les mail pour les utilisateurs virtuels de nos domaines virtuels.
Il faudra plus tard annoncer sur internet que la machine réceptionnant les mails de ces domaines virtuels est la votre. Il vous faut créer dans un DNS accessible des enregistrements MX mettant en relation les domaines virtuels servis et le nom de la machine postfix.
Renseignez-vous auprès de l'administrateur de votre DNS.
Chapitre précédent
Retour à l'index
Chapitre suivant