Apprenons à Postfix à utiliser la base MySQL - Debian 9.0 Stretch
Rédigé par Marc GUILLAUME | 1 commentaireTraduction de la page : https://workaround.org/ispmail/stretch/postfix-mysql
Dans le chapitre précédent vous avez créé une base de données SQL et y avez inséré quelques données d'essai. Le point d'entrée pour tous les emails sur votre système est Postfix. Donc vous devez indiquer à Postfix comment il peut extraire des informations de la base de données. Commençons par lui indiquer comment il peut trouver si un certain domaine est un domaine valide.
virtual_mailbox_domains
Comme nous l'avons décrit auparavant, dans Postfix un mapping est simplement une table contenant une colonne gauche (LHS pour left-hand-side) et une colonne droite (RHS pour right-hand-side). Pour faire en sorte que Postfix utilise MySQL nous avons besoin d'un fichier .cf (fichier de configuration). Commencez par créer un fichier du nom de /etc/postfix/mysql-virtual-mailbox-domains.cf pour les domaines de courrier virtuels contenant :
user = mailuser password = fLxsWdf5ABLqwhZr <- utilisez ici votre propre mot de passe hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
Imaginez que Postfix recoive un mail pour somebody@example.org et veuille savoir si example.org est un domaine de courrier virtuel. Il va lancer la requête ci-dessus et remplacer %s par example.org. Si il trouve une telle ligne dans la table des domaines virtuels il va recevoir comme résultat de sa requête « 1 ». En fait la valeur de retour n'a pas d'importance dans qu'il y a un résultat.
Note : vous pourriez être tenté d'écrire « localhost » au lieu de « 127.0.0.1 ». Ne faites pas ça car il y a en fait une différence dans ce contexte. Je l'ai déjà expliqué dans la page précédente mais laissez moi le répéter : « localhost » indique à Postfix de chercher le fichier de socket de MariaDB et il ne peut le trouver dans sa prison chrootée /var/spool/postfix car ce socket est à /var/run/mysqld/mysqld.sock par défaut. Mais si vous demandez à Postfix d'utiliser 127.0.0.1 comme indiqué ici, vous indiquez à Postfix d'utiliser une connexion TCP au port 3306 sur localhost, ce qui fonctionne même si Postfix est chrooté.
Vous devez maintenant indiquer à Postfix d'utiliser ce mapping de base de données :
postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
La commande postconf ajoute de manière adéquate les lignes de configuration dans votre fichier /etc/postfix/main.cf. Il active également instantanément la nouvelle configuration et vous évite d'avoir à relancer le processus Postfix.
Le jeu d'essai que vous avez créé auparavant contient le domaine « example.org » comme un de vos domaines de courrier. Demandons à Postfix si il reconnaît ce domaine :
postmap -q example.org mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Vous devriez obtenir « 1 » comme résultat. Votre promier mapping fonctionne. Voyons le deuxième.
virtual_mailbox_maps
Vous allez maintenant définir le mapping virtual_mailbox_maps qui lie une adresse mail (LHS) avec l'emplacement de la boîte à lettres de l'utilisateur sur votre disque dur (RHS). Postfix possède un service de distribution intégré appelé virtual qui peut réceptionner les mails et les copier dans ce répertoire. Mais nous ne l'utiliserons pas dans notre cas. À la place nous utiliserons le service de transport dovecot pour nous simplifier un peu la vie.
Puisque nous utilisons dovecot pour la distribution Postfix va juste vérifier si l'adresse du destinataire est définir dans le mapping virtual_mailbox_maps. Mais il ignorera le RHS. Postfix n'a besoin que de vérifier si une certaine adresse est valide. Similaire à ce que nous avons fait au dessus vous avez besoin d'une requête qui recherche une adresse email et qui renvoie « 1 ».
Pour ça créez un nouveau fichier de configuration /etc/postfix/mysql-virtual-mailbox-maps.cf :
user = mailuser password = fLxsWdf5ABLqwhZr <- utilisez ici votre propre mot de passe hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
Dites à Postfix que ce fichier de mapping est supposé être utilisé pour les virtual_mailbox_maps :
postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Essayons de voir si Postfix est satisfait de ce mapping en lui demandant où le répertoire de boîte aux lettres de « john@example.org » devrait être trouvé :
postmap -q john@example.org mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Vous devriez obtenir comme réponse « 1 » ce qui indique que « john@example.org » est un compte de mail virtuel existant sur votre serveur. Très bien, plus tard quand nous traiterons de la configuration de Dovecot nous utiliserons également le champ mot de passe mais Postfix n'en a pas besoin ici. Passons au mapping suivant :
virtual_alias_maps
Le mapping virtual_alias_maps est utilisé pour les transferts de mails depuis un adresse vers d'autres. On peut définir plusieurs destinations. Dans la base de données on obtient ce résultat en créant plusieurs enregistrements. Relisez la page sur les domaines virtuels si désirez des détails.
Créez un nouveau fichier de configuration .cf /etc/postfix/mysql-virtual-alias-maps.cf :
user = mailuser password = fLxsWdf5ABLqwhZr <-- utilisez ici votre propre mot de passe hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
Indiquez à Postfix d'utiliser ce mapping :
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Vérifiez que le mapping fonctionne comme prévu :
postmap -q jack@example.org mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Vous devez voir s'afficher la destination attendue :
john@example.org
Donc si Postfix recevait un mail pour jack@example.org il le transférerais à john@example.org.
Les alias attrappe-tout (Catch-all)
Comme expliqué auparavant dans ce guide il existe un moyen de transférer tous les mails pour toutes les adresses mail d'un domaine vers une adresse mail particulière. C'est ce qu'on appelle un alias catch-all. Les catch-alls récupèrent tous les mails pour un domaine même si l'utilisateur virtuel destinataire n'existe pas. Les Catch-all sont une mauvaise chose, vraiment. Il est tentant de rediriger toutes les adresses mail vers une seule personne, par exemple si votre service marketing demande chaque semaine un nouvel alias. Mais l'inconvénient est que vous allez recevoir une quantité délirante de spam, parce que les spammeurs on l'habitude d'envoyer leurs cochonneries à toute sorte d'adresses de votre domaine. Ou bien un expéditeur fera une faute de frappe dans l'adresse mail d'un utilisateur et le serveur transferera ce mail au lieu de le rejeter pour une bonne raison. Donc réfléchissez à deux fois avant d'activer une adresse catch-all.
Je n'ai pas réussi à vous convaincre de ne pas toucher à ces sales trucs ? Bon, d'accord. Un alias catch-all ressemble à « @example.org » et transfert tous les mails pour le domaine entier vers une autre adresse. Nous avons créé l'utilisateur john@example.org et nous voudrions transférer tous les autres mails du domaine vers kerstin@example.com. Nous devons ajouter une alias catch-all de cette forme :
source | destination |
---|---|
@example.org | kerstin@example.com |
Mais il y a un piège. Imaginez ce qui va arriver quand Postfix va recevoir un mail pour john@example.org. Postfix va commencer par regarder les alias dans la table virtual_alias_maps (il ne regarde pas la table virtual_mailbox_maps auparavant). Il trouve l'alias catch-all défini ci-dessus et comme il n'y a pas d'alias plus spécifique, l'alias catch-all est utilisé et le mail est redirigé vers kerstin@example.com. John ne recevra jamais ce mail. Et ce n'est pas ce que vous vouliez.
Il faut donc en fait que la table des alias ressemble à ça :
destination | |
---|---|
@example.org | kerstin@example.com |
john@example.org | john@example.org |
Les alias les plus spécifiques sont pioritaires sur les alias catch-all. Postfix va trouver une entrée pour john@example.org en premier et voir que le mail doit être transféré à john@example.org (la même adresse). Cette astuce peut sembler tordue, mais est nécessaire si vous plannifiez d'utiliser des comptes catch-all.
Postfix va inspecter tous les mappings ci-dessous :
- john@example.org (le plus spécifique)
- john (qui ne fonctionnera que si example.org est le domaine $myorigin domain)
- @example.org (catch-all le moins spécifique)
Ceci est précisé dans la page de manuel virtual(5) man dans la section TABLE SEARCH ORDER.
Pour ce mapping de « john vers lui-même » vous devez créer un fichier .cf /etc/postfix/mysql-email2email.cf pour le dernier mapping :
user = mailuser password = fLxsWdf5ABLqwhZr <- utilisez ici votre propre mot de passe hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s'
Indiquez à Postfix d'utiliser ce mapping :
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Vérifiez que vous obtenez l'adresse de John quand vous demandez à Postfix si il existe un alias pour son adresse :
postmap -q john@example.org mysql:/etc/postfix/mysql-email2email.cf
Le résultat devrait être la même adresse :
john@example.org
Maintenant vous devez dire à Postfix qu'il devrait vérifier à la fois les alias et l'alias « john vers lui-même » :
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
L'ordre des deux mappings n'a pas d'importance ici.
Voilà c'est fait ! Tous les mappings sont configurés et la base est prête à être remplie avec des domaines et des utilisateurs. Assurez-vous que seuls root et l'utilisateur postfix puissent lire les fichiers « .cf » (après-tout il contiennent le mot de passe de base de données) :
chgrp postfix /etc/postfix/mysql-*.cf chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf