Connecter Postfix à la base de données - Debian 7.0 Wheezy
Rédigé par Marc GUILLAUME | Aucun commentaireCréer la liaison entre Postfix et la base de données MySQL.
Dans le chapitre précédent vous avez rempli la base de données. Maintenant il est temps de l'utiliser. Le point d'entrée de tout email sur votre système est Postfix. Il nous faut donc dire à Postfix comment trouver les informations enregistrées dans la base de données. Commençons par lui dire quels domaines virtuels vous utilisez.
virtual_mailbox_domains
Comme décrit dans les chapitres précédents une table de correspondance (un mapping) dans Postfix est simplement une table qui contient une colonne gauche (LHS) et une colonne droite (RHS). Pour permettre à Postfix d'utiliser MySQL pour définir une table de correspondance nous avons besoin d'un fichier .cf (un fichier de configuration). Commençons par créer un fichier appellé /etc/postfix/mysql-virtual-mailbox-domains.cf pour la table de correspondance virtual_mailbox_domains qui contiendra :
user = mailuser password = fLxsWdf5ABLqwhZr <-- utilisez votre propre mot de passe de base de donnée ici hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
Imaginez que Postfix reçoive un email pour somebody@example.org et cherche à savoir si example.org est un domaine de courrier virtuel existant sur le serveur. Il lancera la requête ci-dessus et remplacera %s par example.org. Si il trouve une entrée dans la table virtual_domains il va renvoyer la valeur '1'. Pour l'instant il n'est pas très important de savoir exactement ce qui est retourné, du moment qu'un résultat existe.
Note : Vous pourriez être tenté d'écrire localhost au lieu de 127.0.0.1. Ne faites pas ça, car en fait il existe une différence entre les deux dans ce contexte. localhost va conduire Postfix à rechercher le fichier socket de MySQL qu'il ne pourra trouver car il est emprisonné dans un chroot dans /var/spool/postfix et que le socket est dans /var/run/mysqld/mysqld.sock par défaut. Mais si vous dites à Postfix d'utiliser 127.0.0.1 comme indiqué ici, vous dites à Postfix d'utiliser une connexion TCP sur le port 3306 sur localhost ce qui fonctionne même si Postfix est chrooté.
Vous devez maintenant indiquer à Postfix d'utiliser cette table de correspondances :
postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
(la commande postconf -e ajoute convenablement la ligne de configuration à votre fichier /etc/postfix/main.cf. Elle va également activer instantanément activer les nouveaux réglages sans que vous ayez à relancer le processus Postfix.)
Postfix va maintenant rechercher dans votre table virtual_domains si example.org y figure. Voyons si ça marche. Vous avez configuré le domaine example.org dans le chapitre précédent. Nous pouvons donc demander à Postfix si maintenant de voir s'il peut trouver le domaine dans la base de données :
postmap -q example.org mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Le résultat que vous devriez obtenir est '1'. Votre première table de correspondance fonctionne. Passons à la deuxième.
virtual_mailbox_maps
Vous allez maintenant définir la table de correspondance virtual_mailbox_maps qui fait correspondre les adresses mail (colonne gauche) avec l'emplacement de la boîte de l'utilisateur sur le disque dur (colonne droite). Si vous sauvegardiez les mails entrants sur le disque dur en utilisant l'agent de distribution (virtual delivery agent) inclut dans Postfix elle serait interrogée pour trouver le chemin de la boîte mail. Mais dans notre configuration la distribution du courrier est assurée par le LDA Dovecot (local delivery agent, agent de distribution locale), Postfix n'a pas vraiment à se soucier de ce chemin. Postfix a juste besoin de vérifier si une adresse mail est valide. Comme dans le cas précédent vous avez besoin d'une requête SQL cherchant l'adresse mail et renvoyant '1' si elle existe.
Vous devez maintenant créer un fichier .cf pour indiquer à Postfix la requête nécessaire pour interroger cette table. En plus de l'adresse mail il est également important de récupérer le mot de passe de l'utilisateur. Comme le chemin des boîtes mail des utilisateurs est fixe, il n'est pas important de récupérer cette information dans la base de données. La structure des répertoires sera toujours /var/vmail/$DOMAIN/$USER. Ainsi pour l'exemple de John il serait /var/vmail/example.org/john.
Maintenant les choses sont un peu plus simples et vous pouvez finalement créer un fichier .cf dans /etc/postfix/mysql-virtual-mailbox-maps.cf aussi simple que :
user = mailuser password = fLxsWdf5ABLqwhZr <-- utilisez votre propre mot de passe de base de donnée ici hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
Indiquez à Postfix que ce fichier est censé être utilisée pour interroger la table de correspondance virtual_mailbox_maps :
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Testez si Postfix est content avec ce fichier en lui demandant où le répertoire de john@example.org devrait se trouver :
postmap -q john@example.org mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Vous devriez obtenir comme réponse '1' qui signifie que john@example.org est un utilisateur virtuel de courrier qui existe sur votre serveur. Ensuite dans la section consacrée à la configuration de Dovecot vous utiliserez également les champs email et password mais Postfix n'en a pas besoin ici. Parfait, il reste une seule table de correspondance à définir :
virtual_alias_maps
La table virtual_alias_maps est utilisée pour les redirections d'une adresse mail à une autre. Il est possible d'indiquer plusieurs destinations. Dans la base de données ceci est réalisé en créent différentes lignes. Voyez la page consacrée aux domaines virtuels si vous voulez des détails.
Créez un autre fichier .cf avec ce chemin /etc/postfix/mysql-virtual-alias-maps.cf :
user = mailuser password = fLxsWdf5ABLqwhZr <-- utilisez votre propre mot de passe de base de donnée ici hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
Indiquez à Postfix d'utiliser cette table :
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Testez si tout fonctionne comme prévu ::
postmap -q jack@example.org mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Vous devriez voir la destination prévue :
john@example.org
Optionnel: la Magie Noire nécessaire si vous voulez autoriser les alias catch-all
Comme expliqué plus haut dans ce guide, il existe un moyen de rediriger tous les mails pour un domaine vers une adresse mail particulière. C'est ce qu'on appelle un alias catchall (attrape-tout). Ces catchall, comme leur nom l'indique, récupèrent tous les mails pour un domaine si il n'existe pas un utilisateur enregistré correspondant à l'adresse mail. Les catchall sont sérieusement mauvais. Il est tentant de rediriger toutes les adresses inconnues vers une seule adresse si par exemple votre département marketing vous demande une nouvelle adresse mail chaque semaine. Mais l'inconvénient est que vous allez recevoir une quantité encore plus insensée de spam parce que les spammeurs vont envoyer leurs saloperie vers toutes les adresses possibles sur votre serveur. Ou peut-être un utilisateur va-t-il faire un erreur en orthographiant une adresse mail, mais le serveur va le rediriger au lieu de le rejeter pour une bonne raison. Donc réfléchissez-y à deux fois avant de créer un catchall.
Un alias catchall ressemble à ça @example.org et transmet tous les mails sans destinataire enregistré pour un domaine vers un seul compte. Nous avons créé l'utilisateur john@example.org et nous voudrions rediriger tous les autres courriers à destination de ce domaine vers kerstin@example.com. Nous devrions donc ajouter un alias catchall sous cette forme :
source | destination |
---|---|
@example.org | kerstin@example.com |
Maintenant imaginez ce qui se passe quand Postfix reçoit un mail pour john@example.org. Postfix va commencer par vérifier la table des redirections dans la table virtual_alias_maps (il ne regarde pas virtual_mailbox_maps pour le moment). Il trouve le catchall et comme il n'existe pas d'alias plus précis c'est le catchall qui est retenu et le mail est envoyé sur kerstin@example.com. John ne recevra jamais aucun courrier. Ce n'est probablement pas ce que vous vouliez. Il faut donc que votre table ressemble à cela :
destination | |
---|---|
@example.org | kerstin@example.com |
john@example.org | john@example.org |
Les alias plus spécifiques ont priorité sur les alias généraux catchall. Postfix va examiner toutes les correspondance pour ;
- john@example.org (le plus spécifique)
- john (fonctionne seulement si example.org est le domaine $myorigin)
- @example.org (catchall - le moins spécifique)
Postfix va d'abord trouver une entrée pour john@example.org et voir que ce mail doit être « redirigé » vers john@example.org, c'est à dire la même adresse mail. Cette astuce peut sembler bizarre, mais est nécessaire si vous envisagez d'utiliser des comptes catchall. Ainsi la table virtual_alias_maps doit obéir à la fois à la vue view_aliases et à cette correspondance de john vers lui-même. Ceci est souligné dans la page de manuel virtual(5) man page dans la section TABLE SEARCH ORDER.
Créez un fichier .cf nommé /etc/postfix/mysql-email2email.cf pour la dernière table de correspondance :
user = mailuser password = fLxsWdf5ABLqwhZr <-- utilisez votre propre mot de passe de base de donnée ici hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s'
Vérifiez que vous obtenez l'adresse mail de John quand vous demandez à Postfix si il existe un alias pour lui :
postmap -q john@example.org mysql:/etc/postfix/mysql-email2email.cf
Le résultat devrait être la même adresse :
john@example.org
Maintenant il vous faut dire à Postfix que ces deux tables de correspondance devraient être interrogées en ajoutant cette ligne à main.cf :
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
L'ordre des tables n'a pas d'importance ici.
C'est fait ! Toutes les tables de correspondance sont configurées et la base de données est prête pour être remplie avec des domaines et des utilisateurs. Assurez-vous que seuls les utilisateurs root et postfix peuvent lire les fichiers .cf, après tout, le mot de passe de votre base de données y figure en clair :
chgrp postfix /etc/postfix/mysql-*.cf chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf