Réseau - Web - GNU/Linux

2012 15 février

Liaison entre Postfix et la base de données - Debian 6.0 Squeeze

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

Créer la liaison entre Postfix et la base de données MySQL.

Dans le précédent chapitre vous avez créé la base de données MySQL. Il est maintenant temps de l'utiliser. Le point d'entrée de tous les mails dans votre système est Postfix. Nous devons donc lui dire comment accéder aux informations stockées dans la base de données. Commençons par lui indiquer les domaines virtuels que vous hébergez :

virtual_mailbox_domains

Comme indiqué auparavant une table de mapping dans Postfix est simplement une table qui contient des données gauche (LHS) et des données droites (RHS). Pour faire en sorte que Postfix puisse utiliser MySQL pour définir une table de mapping, nous avons besoin d'un fichier de configuration en « .cf ». Commençons par créer un fichier /etc/postfix/mysql-virtual-mailbox-domains.cf pour la table de désignation des virtual_mailbox_domains qui contienne :

user = mailuser
password = mailuser2011
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Imaginez que Postfix reçoive un mail pour somebody@example.org et veuille savoir si example.org est un domaine de courrier virtuel. Il lancera la requête SQL ci-dessus en remplaçant '%s' par 'example.org'. S'il trouve une telle entrée dans la table virtual_domains il retournera alors '1'. Pour l'instant la valeur renvoyée n'a pas d'importance, tant qu'il existe un résultat.

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

Il faut également indiquer à Postfix d'utiliser ce fichier de configuration :

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

(La commande postconf avec l'option -e ajoute de manière propre des lignes de configuration à votre fichier /etc/postfix/main.cf. Il active également la nouvelle configuration instantanément, dispensant d'avoir à relancer Postfix.)

Postfix cherchera maintenant dans votre table des domaines virutels si example.org est un domaine de courrier virtuel valide. Vérifions si cela fonctionne. Vous avez déjà créé le domaine example.org dans le chapitre précédent. Vous pouvez donc demander maintenant à Postfix de regarder s'il trouve le domaine dans la base :

$> postmap -q example.org mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

vous devriez obtenir '1' comme résultat. Votre première désignation fonctionne. Très bien. Continuons avec la seconde.

Note du traducteur : Si vous obtenez un message d'erreur vous disant postmap: warning: connect to mysql server 127.0.0.1: Access denied... c'est que vous avez un problème avec le compte « mailuser » que vous utilisez pour la connexion à la base de données. Revérifiez les droits MySQL.

Si vous obtenez un message d'erreur disant postmap: warning: connect to mysql server 127.0.0.1: Can't connect to MySQL server on '127.0.0.1' alors soit votre serveur MySQL ne fonctionne pas, soit au minimum il n'écoute pas sur 127.0.0.1. Vérifiez la configuration de votre serveur MySQL (/etc/mysql/my.cnf).

virtual_mailbox_maps

Vous allez maintenant définir les utilisateurs virtuels avec les désignations du fichier virtual_mailbox_maps qui met en relation les adresses mail (colonne de gauche) avec l'emplacement de la boîte de l'utilisateur sur le disque dur (colonne de droite). Si vous enregistriez des courriers sur le disque dur en utilisant Postfix, la routine interne virtual delivery agent il faudrait connaître le chemin vers le dossier de boîte à lettres. Mais dans notre configuration la distribution du courrier est effectuée par l'agent de distribution locale Dovecot, ce qui fait que Postfix en fait ne s'occupe pas de ce chemin. Postfix a juste besoin de savoir si une certaine adresse de courrier est ou non valide. Comme au dessus vous avez besoin d'une requête SQL qui recherche une adresse email et retourne '1'.

Ensuite vous devrez créer un fichier « .cf » pour indiquer à Postfix comment interroger cette table. En plus de l'adresse mail l'autre information importante est le mot de passe de l'utilisateur. Comme le chemin vers la boîte de l'utilisateur est fixe il n'est pas nécessaire de l'obtenir depuis la base de données. La structure des répertoires sera toujours /var/vmail/$DOMAIN/$USER. Par exemple pour John on aurait /var/vmail/example.org/john.

Maintenant les choses sont un peu plus simples et vous pouvez créer le fichier « .cf » suivant /etc/postfix/mysql-virtual-mailbox-maps.cf dont le contenu est simplement :

user = mailuser
password = mailuser2011
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

Dites à Postfix que cette table doit être utilisée pour retrouver les mappings des virtual_mailbox_maps :

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

Testez si Postfix est satisfait de cette désignation en lui demandant où la boîte de courrier de john@example.org se trouve :

$> 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 une boîte d'utilisateur virtuel existante sur votre serveur. Plus loin, dans la configuration de Dovecot vous utiliserez également les colonnes email et password, mais Postfix n'en a pas besoin ici. C'est parfait, il ne reste qu'une table de mapping à définir :

virtual_alias_maps

La table virutal_alias_maps est utilisée pour la redirection d'une adresse email sur une autre. On peut indiquer plusieurs destinations. Dans la base de données ceci est obtenu en créant plusieurs enregistrements. Voyez ou revoyez la page domaines virtuels si vous voulez connaître les détails.

Créez un autre fichier « .cf » /etc/postfix/mysql-virtual-alias-maps.cf :

user = mailuser
password = mailuser2011
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 ça fonctionne comme attendu :

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

Vous devriez voir affichées la destination attendue :

john@example.org

En opition : un peu de "magie noire" si vous avez besoin d'utiliser les catchall

Comme expliqué plus haut dans ce guide, il existe un façon de rediriger tous les mails pour un domaine sur une addresse particulière. Cette adresse est appellée « attrape-tout », catchall en anglais. Comme leur nom l'indique les « attrape-tout » attrapent tous les mails pour un domaine si le nom d'utilisateur spécifié dans le mail ne correspond à aucun utilisateur existant. Il ressemblent à ça : @example.org et redirigent tous les mails d'un domaine sur un seul compte. Nous avons créé le compte john@example.org et nous voudrions que tous les autres mails sur ce domaine soient renvoyés sur kerstin@example.com. Pour cela nous créons un alias attrape-tout :

source (LHS) destination (RHS)
@example.org kerstin@example.com

Maintenant imaginons ce qui se passe quand Postfix reçoit un email pour john@example.org. Postfix vérifie d'abord s'il n'existe pas d'alias de redirection dans la table virtual_alias_maps. (il ne s'occupe pas de la table virtual_mailbox_maps à cette étape). Il trouve l'adresse attrappe-tout et puisqu'il n'y a pas d'alias plus spécifique c'est cette adresse qui est considérée correspondre et est prise en compte, le mail est donc redirigé vers kerstin@example.com. Ce n'est sans doute pas ce que vous aviez souhaité. Il faut donc modifier la table pour qu'elle ressemble à ça :

source (LHS) destination (RHS)
@example.org kerstin@example.com
john@example.org

john@example.org

Les alias plus spécifiques ont priorité sur les alias attrappe-tout. Postfix prend en considération les adresses en suivant cette priorité :

  • john@example.org (le plus spécifique)
  • john (qui ne fonctionne que si example.org correspond au domaine défini dans $myorigin)
  • @example.org (attrape-tout, le moins spécifique)

Postfix va trouver une entrée pour john@example.org en premier et voir que cette adresse doit être « redirigée » sur john@example.org, la même adresse mail. Cette astuce peut sembler tordue, mais elle est nécessaire si vous envisagez d'utiliser des adresse attrape-tout. Ainsi la table virtual_alias_maps doit obéir à la fois à la vue « view_alias » et à la redirection « john-vers-lui-même ». Tout ceci est précisé dans la page de man virtual(5) dans la section TABLE SEARCH ORDER.

Créez un fichier « .cf » /etc/postfix/mysql-email2email.cf pour la table suivante :

user = mailuser
password = mailuser2011
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'

Vérifiez que vous récupérez l'adresse de john quand vous demandez à Postfix l'existence d'alias pour son adresse :

$> postmap -q john@example.org mysql:/etc/postfix/mysql-email2email.cf

Le résultat doit être la même adresse :

john@example.org

Il faut maintenant indiquer à Postfix de rajouter ces deux fichiers au fichier de configuration main.cf :

$> postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf

L'ordre de ces fichiers n'a pas d'importance ici.

Ça y est ! Toutes les tables de mapping sont configurées et la base de données est prête pour être remplie avec les données des domaines et des utilisateurs. Assurez-vous que seuls les utilisateurs 'root' et 'postfix' puissent lire les fichiers « .cf ». Après-tout votre mot de passe de base de données est stocké en clair dans ces fichiers :

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

Écrire un commentaire

Quelle est la troisième lettre du mot kgxf ?

Fil RSS des commentaires de cet article

À propos

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

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

Mes coordonnées

Marc Guillaume
contact[at]yakati.info
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