Réseau - Web - GNU/Linux

2016 06 juin

Apprenons à Postfix à utiliser la base MySQL - Debian 8.0 Jessie

Rédigé par Marc GUILLAUME | Aucun commentaire
Article précédent Mail façon FAI - Debian 8.0 Jessie Article suivant

Traduction de la page https://workaround.org/ispmail/jessie/postfix-mysql

Dans les chapitres précédents vous avez créé la structure d'une base de données MySQL et y avez inséré un jeu de données de test. Le point d'entrée pour tout email dans votre système est Postfix. Il faut donc que nous apprenions à Postfix la façon d'aller chercher des informations dans la base de données. Commençons par lui apprendre à déterminer si un domaine donné est un domaine de mail valide.

virtual_mailbox_domains

Comme nous l'avons évoqué plus haut, un « mapping » dans Postfix est simplement un tableau contenant une colonne gauche (LHS) et une colonne droite (RHS). Pour que Postifix puisse utiliser MySQL nous devons créer un fichier .cf (fichier de configuration). Commençons par créer un fichier appelé /etc/postfix/mysql-virtual-mailbox-domains.cf pour créer l'équivalent d'un mapping des boites mail virtuelles (virtual_mailbox_domains) et qui contiendra :

user = mailuser
password = fLxsWdf5ABLqwhZr​    <- utilisez votre propre mot de passe utilisateur ici
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Imaginons que Postfix reçoive un mail pour « somebody@example.org » et veuille savoir si « example.org » est un domaine de mail virtuel. Il va lancer la requête SQL ci-dessus et remplacer %s par « example.org ». Si il existe une ligne dans la table des domaines virtuels correspondant à « example.org », la requête va retourner « 1 ». En fait la valeur retournée n'a pas d'importance du moment qu'il y a une réponse.

Note : vous pourriez être tenté d'écrire « localhost » au lieu de « 127.0.0.1. ». Ne le faites pas car il existe en fait une différence dans ce contexte entre les deux. « localhost » va imposer à Postfix de chercher un fichier de socket MySQL et il ne pourra le trouver car il est dans une prison chrootée dans /var/spool/postfix et que le socket se trouve dans /var/run/mysqld.mysqld.sock par défaut. Mais si vous demandez à Postfix d'utiliser « 127.0.0.1 », comme proposé ici, vous obligerez Postfix à utiliser une connexion TCP sur le port 3306 sur localhost, ce qui fonctionnera même si Postfix est dans une prison.

Maintenant il faut que Postfix utilise le mapping de la base de données :

postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

La commande postconf ajoute la nouvelle ligne de configuration comme il convient dans votre fichier /etc/postfix/main.cf. Elle active également instantanément la nouvelle configuration vous évitant d'avoir à relancer le processus Postfix.

Le jeu de test que vous avez créé a ajouté le domaine example.org dans la liste 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éponse. Votre premier mapping fonctionne. Super, passons au deuxième.

virtual_mailbox_maps

Vous allez maintenant définir le mapping virtual_mailbox_maps  qui lie les adresses mail (côté gauche, LHS) au répertoire où se trouvent la boîte aux lettres de l'utilisateur sur votre disque dur (côté droit, RHS). Postfix a son propre service de transport appelé « virtual » qui peut recevoir le mail et le placer dans ce répertoire. Mais nous n'allons pas procéder de cette façon. À la place nous utiliserons le service de transport de dovecot pour nous simplifier un peu la vie.

Maintenant comme nous utilisons « dovecot » Postfix va toujours vérifier que l'adresse mail existe dans le mapping virtual_mailbox_maps. Mais il va ignorer le côté droit. Postfix a juste besoin de savoir si un adresse mail est valide. De manière similaire au mapping précédent vous avez besoin d'une requête SQL qui recherche une adresse email et retourne « 1 » si il elle existe.

Pour faire ça créons un nouveau fichier de configuration /etc/postfix/mysql-virtual-mailbox-maps.cf :

user = mailuser
password = fLxsWdf5ABLqwhZr    <- utilisez votre propre mot de passe utilisateur ici
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

Dites à Postfix que ce fichier de mapping est censé être utilisé pour le mapping de virtual_mailbox_maps :

postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Testons pour voir si Postfix est content avec son nouveau mapping, en lui demandant où est le répertoire des mails de l'utilisateur « john@example.org » :

postmap -q john@example.org mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

la réponse devrait être « 1 » ce qui signifie que « john@example.org » est un utilisateur de boîte mail virtuelle 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 pour le moment. Occupons nous du prochain mapping :

virtual_alias_maps

Le mapping virtual_alias_maps est utilisé pour les transferts d'emails d'une adresse à une autre. Il est possible d'avoir plusieurs destinations. Dans la base de données cela se matérialise par plusieurs lignes. Relisez la page sur les domaines virtuels si vous avez besoin de détails.

Créez un autre fichier en .cf à cet endroit /etc/postfix/mysql-virtual-alias-maps.cf :

user = mailuser
password = fLxsWdf5ABLqwhZr   <-- utilisez votre propre mot de passe utilisateur ici
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Déclarez ce mapping à Postfix :

postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Testez si le fichier de mapping fonctionne comme attendu :

postmap -q jack@example.org mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Vous devriez lire la destination attendue :

john@example.org

Comme ça si Postfix recevait un mail pour « jack@example.org » il le transfèrerait à « john@example.org ».

Les alias attrape-tout

Comme expliqué précédemment dans ce guide il existe un moyen pour transférer toutes les adresses possibles dans un domaine vers une seule adresse email. C'est ce que l'on appelle « catchall alias » en anglais. Comme leur nom l'indique (to catch = attrapper) ils attrappent tous les emails pour un domaine si il n'existe pas d'utilisateur virtuel déclaré pour cette adresse. Ces catchalls sont diabolique, sérieusement. Il est tentant de transférer toute adresse email vers une personne, par exemple votre service commercial qui vous demande une nouvelle adresse mail chaque semaine. Mais l'inconvénient c'est que vous aurez encore plus de spams parce que les spammeurs enverront leur cochonneries à tout un tas d'adresses sur votre domaine. Ou simplement un expéditeur fera une faute d'orthographe dans le nom d'un destinataires mais le serveur de mail, au lieu de le refuser comme il le devrait, le transfèrera à l'adresse catchall. Donc réfléchissez à deux fois avant d'utiliser ces alias « catchall alias ».

Je n'ai pas réussi à vous convaincre de ne pas mettre les pieds dans cet enfer ? Bon d'accord. Un alias catchall ressemble à « @example.org » et transmet 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 mail pour ce domaine à l'adresse « kerstin@example.com ». Pour cela nous avons besoin d'un alias de ce genre :

source destination
@example.org kerstin@example.com

Mais il y a un hic. Imaginez ce qui arrive quand Postfix reçoit un email pour « john@example.org ». Postfix va d'abord vérifier les alias dans la table virtual_alias_maps (il ne regarde pas la table virtual_mailbox_maps à ce stade). Il va trouver le compte catchall et le mail va être redirigé vers « kerstin@example.com ». John ne recevra jamais aucun email. Ce n'est pas ce que vous vouliez.

Du coup la table doit plutôt ressembler à cela :

email destination
@example.org kerstin@example.com
john@example.org john@example.org

Les alias les plus spécifiques ont priorité sur les alias généraux (catchall). Postfix trouvera d'abord une entrée pour « john@example.org » et verra que le mail doit être transférer à « john@example.org », la même adresse mail. Cette finasserie semble assez moche, mais est indispensable si vous envisagez d'utiliser des alias catchall.

Postfix interrogera ce mapping pour chacun de ces cas et dans cet ordre :

  • john@example.org (le plus spécifique)
  • john (qui ne fonctionnera que si « example.org » est le domaine déclaré dans la variable $myorigin)
  • @example.org (catchall – le moins spécifique)

Ceci est précisé dans la page man de virtual (man virtual(5)) dans la section TABLE SEARCH ORDER.

Pour cette redirection de John vers lui-même vous devez créer un autre fichier .cf à cet endroit /etc/postfix/mysql-email2email.cf pour le dernier mapping :

user = mailuser
password = fLxsWdf5ABLqwhZr    <- utilisez votre propre mot de passe utilisateur ici
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'

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 informer Postfix qu'il doit à la fois vérifier la table des alias et celle de « 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'est pas important ici.

Ça y est  ! Tous les « mappings » sont configurés et la base de données est prête à être remplie des vrais domaines et utilisateurs. Assurez-vous que seuls les utilisateurs root et postfix peuvent lire les fichiers .cf (après-tout votre mot de passe de base de données y figure en clair) :

chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Écrire un commentaire

Quelle est la deuxième lettre du mot jtmlgh ?

Fil RSS des commentaires de cet article

À propos

Yakati.com - Réseau - Web - GNU/Linux © 2017

Généré par PluXml en 0.043s  - Administration

Mes coordonnées

Marc Guillaume
contact[at]yakati.com
79150 ÉTUSSON

Crédits

Pour la gestion du contenu

Généré par PluXml, le Blog ou Cms sans base de données

Pour le contenu

Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.

Pour le thème

Thème SOLID de blacktie.co adapté pour PluXml