Postfix Configuration · 6 min read · Feb 02, 2026
Utilisateurs et domaines virtuels avec Postfix, Courier et MySQL (Fedora Core 5) - Page 2
6 Créer la base de données MySQL pour Postfix/Courier
Nous créons une base de données appelée mail:
mysqladmin -u root -p create mailEnsuite, nous allons dans le shell MySQL:
mysql -u root -pDans le shell MySQL, nous créons l’utilisateur mail_admin avec le mot de passe mail_admin_password (remplacez-le par votre propre mot de passe) qui a les privilèges SELECT, INSERT, UPDATE, DELETE sur la base de données mail. Cet utilisateur sera utilisé par Postfix et Courier pour se connecter à la base de données mail:
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;Toujours dans le shell MySQL, nous créons les tables dont Postfix et Courier ont besoin:
USE mail;CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;quit;Comme vous l’avez peut-être remarqué, avec la commande quit; nous avons quitté le shell MySQL et sommes de retour dans le shell Linux.
La table domains stockera chaque domaine virtuel pour lequel Postfix doit recevoir des e-mails (par exemple, example.com).
| domain |
| example.com |
La table forwardings est utilisée pour aliaser une adresse e-mail à une autre, par exemple, transférer les e-mails de [email protected] à [email protected].
| source | destination |
| [email protected] | [email protected] |
La table users stocke tous les utilisateurs virtuels (c’est-à-dire les adresses e-mail, car l’adresse e-mail et le nom d’utilisateur sont les mêmes) et les mots de passe (sous forme chiffrée) et une valeur de quota pour chaque boîte aux lettres (dans cet exemple, la valeur par défaut est 10485760 octets, ce qui signifie 10 Mo).
| password | quota | |
| [email protected] | No9.E4skNvGa. (“secret” sous forme chiffrée) | 10485760 |
La table transport est optionnelle, elle est destinée aux utilisateurs avancés. Elle permet de transférer des e-mails pour des utilisateurs uniques, des domaines entiers ou tous les e-mails vers un autre serveur. Par exemple,
| domain | transport |
| example.com | smtp:[1.2.3.4] |
transférerait tous les e-mails pour example.com via le protocole smtp vers le serveur avec l’adresse IP 1.2.3.4 (les crochets [] signifient “ne pas effectuer de recherche de l’enregistrement MX DNS” (ce qui a du sens pour les adresses IP…). Si vous utilisez un nom de domaine complètement qualifié (FQDN) à la place, vous ne devriez pas utiliser les crochets.).
7 Configurer Postfix
Maintenant, nous devons dire à Postfix où il peut trouver toutes les informations dans la base de données. Pour cela, nous devons créer six fichiers texte. Vous remarquerez que je dis à Postfix de se connecter à MySQL à l’adresse IP 127.0.0.1 au lieu de localhost. C’est parce que Postfix s’exécute dans un chroot jail et n’a pas accès au socket MySQL auquel il essaierait de se connecter si je disais à Postfix d’utiliser localhost. Si j’utilise 127.0.0.1, Postfix utilise le réseau TCP pour se connecter à MySQL, ce qui ne pose aucun problème même dans un chroot jail (l’alternative serait de déplacer le socket MySQL dans le chroot jail, ce qui entraîne d’autres problèmes).
Créons maintenant nos six fichiers texte.
vi /etc/postfix/mysql-virtual_domains.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_forwardings.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_mailboxes.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_email2email.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_transports.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |
(Si vous comparez ces fichiers avec les fichiers de https://www.howtoforge.com/virtual_postfix_mysql_quota_courier, vous remarquerez que le format est différent. Cela est dû au changement de syntaxe de Postfix 2.1 à 2.2. Dans ce tutoriel, nous utilisons Postfix 2.2.8, dans l’autre, c’est 2.1.5.)
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cfMaintenant, nous créons un utilisateur et un groupe appelés vmail avec le répertoire personnel /home/vmail. C’est là que toutes les boîtes aux lettres seront stockées.
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -mEnsuite, nous faisons quelques configurations de Postfix. Assurez-vous de remplacer server1.example.com par un FQDN valide, sinon votre Postfix pourrait ne pas fonctionner correctement !
postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "L'utilisateur que vous essayez d'atteindre est en dépassement de quota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
postconf -e 'inet_interfaces = all'Ensuite, nous créons le certificat SSL nécessaire pour TLS:
cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509*<-- Entrez le nom de votre pays (par exemple, "FR").
<-- Entrez le nom de votre état ou province.
<-- Entrez votre ville.
<-- Entrez le nom de votre organisation (par exemple, le nom de votre entreprise).
<-- Entrez le nom de votre unité organisationnelle (par exemple, "Département IT").
<-- Entrez le nom de domaine complètement qualifié du système (par exemple, "server1.example.com").
<-- Entrez votre adresse e-mail. *Ensuite, changez les permissions de smtpd.key:
chmod o= /etc/postfix/smtpd.key8 Configurer Saslauthd
Éditez /usr/lib/sasl2/smtpd.conf. Il devrait ressembler à ceci:
vi /usr/lib/sasl2/smtpd.conf| pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/spool/authdaemon/socket |
Ensuite, désactivez Sendmail et démarrez Postfix, saslauthd et courier-authlib:
chmod 755 /var/spool/authdaemon
chkconfig --levels 235 courier-authlib on
/etc/init.d/courier-authlib startchkconfig --levels 235 sendmail off
chkconfig --levels 235 postfix on
chkconfig --levels 235 saslauthd on
/etc/init.d/sendmail stop
/etc/init.d/postfix start
/etc/init.d/saslauthd start9 Configurer Courier
Maintenant, nous devons dire à Courier qu’il doit s’authentifier contre notre base de données MySQL. Tout d’abord, éditez /etc/authlib/authdaemonrc et changez la valeur de authmodulelist pour qu’elle soit
vi /etc/authlib/authdaemonrc| [...] authmodulelist="authmysql" [...] |
Ensuite, éditez /etc/authlib/authmysqlrc. Il devrait ressembler exactement à ceci (encore une fois, assurez-vous de remplir les bonnes informations de base de données):
vi /etc/authlib/authmysqlrc| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |
Ensuite, redémarrez Courier:
chkconfig --levels 235 courier-imap on
/etc/init.d/courier-authlib restart
/etc/init.d/courier-imap restartEn exécutant
telnet localhost pop3vous pouvez voir si votre serveur POP3 fonctionne correctement. Il devrait renvoyer +OK Hello there . (Tapez quit pour revenir au shell Linux.)
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.