logo piwik

Réseau - Web - GNU/Linux

2011 12 mai

Liaison entre Postfix et la base de données - Debian 5.0 Lenny

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

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

Maintenant la base de données est prête à être remplie avec les informations concernant les comptes d'utilisateurs. 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 désignation 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 désignation, nous avons besoin d'un fichier de configuration en .cf. Commençons par créer un fichier "virtual_mailbox_domains" qui contienne :

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

Imaginez que Postfix reçoive un mail pour est un domaine de courrier virtuel. Il lancera la requête ci-dessus en remplaçant <'%s' par <'example.com'. Si il trouve une telle entrée dans la table

Et il faut 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

Postfix cherchera maintenant dans votre table des domaines virutels si "example.com" est un domaine de courrier virtuel valide. Vérifions si cela fonctionne. Crééz une nouvelle ligne dans la table virtual_domains avec un domaine. Faites-le soit dans PhpMyAdmin en cliquant sur le lien d'insertion ou connectez-vous à votre base de données par la commande :

$> mysql -p mailserver

et exécutez la requête :

mysql>INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com');
exit

En revenant au shell de root vous pouvez maintenant vérifier qu'example.com est bien connu comme domaine de courrier virtuel :

$> postmap -q example.com 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 : Si vous obtenez un message d'erreur vous disant "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

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 enregistrez 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'.

Créons une entrée dans la table virtual_users pour faire un test utilisons john@example.com :

mysql>
INSERT INTO virtual_users (id, domain_id, email, password)
	VALUES (1, 1, 'john@example.com', MD5('summersun'));

Ensuite vous devrez créer un fichier ".cf" pour dire à 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

Maintenant les choses sont un peu plus simples et vous pouvez créer le fichier ".cf" suivant

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

Dites à Postfix que cette table de désignation doit être utilisée pour retrouver les 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.com se trouve :

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

Vous devriez obtenir comme réponse "1", qui signifie que john@example.com 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. Bon, il ne reste qu'une désignation à définir :

virtual_alias_maps

La table virutal_alias_maps est utilisée pour la redirection d'une adresse email sur une autre. Voici quelques exemples indiquant à quoi les entrées de cette table peuvent ressembler :

Source (LHS) Destination (RHS) Signification
john@example.com devnull@workaround.org Redirige les mails de john sur une autre adresse
john@example.com john@example.com
devnull@workaround.org
Délivre une copie au compte original john@example.com mais également une copie à devnull@workaround.org (oui, Postfix sait comprendre ça, ça ne crée pas une boucle)
@example.com john@example.com Délivre tous les mails pour le domaine example.com à john@example.com sauf si il existe un compte utilisateur correspondant.

Si par exemple kerstin@example.com n'existe pas en tant qu'utilisateur spécifique, alors les mails destinés à cette adresse seraient envoyés à john. Si par contre kerstin@example.com est un utilisateur bel et bien existant, alors il recevra le courrier lui-même. C'est ce qu'on appelle une adresse "attrappe-tout" (catchall).

(Voir "man 5 virtual" pour une définition plus formelle.)

Attention : les adresses Catch-All reçoivent le spam. Une énorme quantité de spam. Elles peuvent sembler pratiques car elle transfèrent tous les mails à une seule personne sans avoir à créer d'aliases. Mais les générateurs de spam essayent souvent des noms d'utilisateurs courants sur d'un domaine (ndt : le plus souvent des noms anglo-saxons). Avec un Catch-All vous allez recevoir le courrier pour chacun de ces utilisateurs supposés. Essayez de les éviter et définissez plutôt des adresse email valides. Même si cela semble représenter davantage de travail.

Comme vous le voyez il est possible de déclarer plusieurs destinations. Dans la base de données, cela est réalisé en entrant plusieurs enregistrements. Par exemple la seconde ligne du tableau d'exemple ci-dessus serait divisée en deux enregistrements :

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

Saisissons cet exemple dans la base de données:

 mysql>
INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, 'john@example.com', 'john@example.com'),
       (2, 1, 'john@example.com', 'devnull@workaround.org');

Créez un autre fichier ".cf"

user = mailuser
password = mailuser2009
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s' 

Testez si ça fonctionne comme attendu :

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

Vous devriez voir affichées les deux destinations attendues :

La "magie noire" des redirection d'une adresse sur elle-même

Avant de définir vos alias_virtuels il faut connaître une petite bidouille indispensable. Nous avons vu qu'il existait une type particulier de redirection: l'adresse catchall (attrape-tout). Les "attrape-tout" récupèrent tous les mails d'un domaine si il n'existe pas de compte spécifique de destination. Il ressemblent à ça : "@example.com" et redirigent tous les mails d'un domaine sur un seul compte. Nous avons créé le compte 'john@example.com' et nous voudrions que tous les autres mails sur ce domaine soient renvoyés sur 'kerstin@gmail.com'. Pour cela nous créons un alias attrape-tout :

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

Maintenant imaginons ce qui se passe quand Postfix reçoit un email pour 'john@example.com'. 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 à ce moment là). 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@gmail.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.com kerstin@gmail.com
john@example.com

john@example.com

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.com (le plus spécifique)
  • john (qui ne fonctionne que si example.com correspond au domaine défini dans $myorigin)
  • @example.com (attrape-tout le moins spécifique)

Postfix va trouver une entrée pour john@example.com en premier et voir que cette adresse doit être "redirigée" sur 'john@example.com', 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"

user = mailuser
password = mailuser2009
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.com mysql:/etc/postfix/mysql-email2email.cf

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

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.

Ça y est ! Toutes les tables de désignation sont configurées et la base de données est prête pour être remplie avec les données 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 quatrième lettre du mot egnmp ?

Fil RSS des commentaires de cet article

À propos

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

Généré par PluXml en 0.078s  - 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