Installer un serveur mail multi-domaines

Dans ce tutoriel nous allons voir comment installer et configurer un service d'envoi et de réception des mails complet supportant plusieurs domaines. Le tout se basera sur postfix, courier et mysql.

Postfix est un serveur smtp open-source qui permettra l'envoi de vos mails. Nous allons le configurer pour qu'il permette uniquement aux comptes autorisés d'envoyer des mails mais également pour stocker les mails envoyés par un compte dans le bon dossier.

Création de la base de données

Nous allons tout d'abord créer la base de données des utilisateurs, domaines et alias autorisés. Pour cela vous pouvez utiliser soit phpMyAdmin ou directement en ligne de commande. Voila les données à saisir :

Le nom de la base de données sera postfix, modifiez si besoin.

CREATE DATABASE `postfix`;
USE postfix;
 
-- 
-- Structure de la table `domain`
-- 
CREATE TABLE `domain` (
  `domain` varchar(255) NOT NULL default '',
  `actif` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';
 
-- 
-- Structure de la table `mailbox`
-- 
CREATE TABLE `mailbox` (
  `email` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `quota` int(10) NOT NULL default '0',
  `actif` tinyint(1) NOT NULL default '1',
  `imap` tinyint(1) NOT NULL default '1',
  `pop3` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites mails virtuelles';
 
-- 
-- Structure de la table `alias`
-- 
CREATE TABLE `alias` (
  `source` varchar(255) NOT NULL default '',
  `destination` text NOT NULL,
  `actif` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias virtuels';

Puis on déclare l'utilisateur MySql pour postfix :

GRANT SELECT ON `postfix`.* TO 'postfix'@'%'
IDENTIFIED BY 'pass';

Installation de postfix

On va maintenant installer postfix et son module mysql :

apt-get install postfix postfix-mysql

Chaque utilisateur virtuel verra ses mails stockés physiquement sous forme de fichiers dans un dossier. Étant donné que les utilisateurs sont virtuels, il faut un utilisateur réel comme propriétaire du dossier contenant tous les mails. On va créer cet utilisateur que l'on va nommer vmail :

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m

On va maintenant éditer la configuration de postfix :

vi /etc/postfix/main.cf

Copier la configuration :

# /etc/postfix/main.cf
# Configuration Postfix
# espace.fr.to
#

smtpd_banner = $myhostname ESMTP (Debian/GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes

# ajoute le domaine aux emails de la distribution locale
# ainsi vous pourrez envoyer des emails sans @domain.priv
# par la commande sendmail
mydomain = domain.priv 
append_dot_mydomain = yes

# Envoi une alerte de dépassement de délai par email
#delay_warning_time = 4h

myhostname = smtp.domain.priv

# domaine de distribution local
mydestination = localhost, localhost.localdomain

# Mettez ici le relais smtp de votre FAI si vous avez des problèmes de blacklist
# à cause de votre IP
relayhost =

# adresseIP/Masque des réseaux locaux (réseaux autorisés pour l'envoi de courier)
mynetworks = 127.0.0.0/8 192.168.0.0/24
inet_interfaces = all

#restrictions d'accès
# adresses d'expédition
# le "reject_unknown_sender_domain" verifie que le domaine existe
smtpd_sender_restrictions =
        permit_mynetworks,
        reject_unknown_sender_domain,
        warn_if_reject reject_unverified_sender

# adresses de destination
smtpd_recipient_restrictions =
        permit_mynetworks,
        reject_unauth_destination,
        reject_unknown_recipient_domain,
        reject_non_fqdn_recipient

# client
smtpd_client_restrictions =
		permit_mynetworks,
        reject_unknown_client	        	      

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf,mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = no
virtual_mailbox_limit = 51200000 
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine, essayez plus tard."
virtual_overquota_bounce = yes	

Puis on édite les fichiers de configuration mysql :

vi /etc/postfix/mysql-virtual_domains.cf

# mysql-virtual_domains.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif=1

vi /etc/postfix/mysql-virtual_mailboxes.cf	
# mysql-virtual_mailboxes.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif=1
vi /etc/postfix/mysql-virtual_aliases.cf
# mysql-virtual_aliases.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif=1

vi /etc/postfix/mysql-virtual_aliases_mailbox.cf

# mysql-virtual_aliases_mailbox.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif=1
vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
# mysql-virtual_mailbox_limit_maps.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = quota
table = mailbox
where_field = email

Un peu de protection :

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

On redémarre et on check :

/etc/init.d/postfix restart
postfix check

On installe courier :

apt-get install courier-base courier-authdaemon courier-authlib-mysql courier-imap courier-pop

Répondre non pour la création des dossiers.

On édite la configuration :

vi /etc/courier/authdaemonrc

Remplacer

authmodulelist="authpam"

par :

authmodulelist="authmysql"

Puis on configure l'accès par mysql :

vi /etc/courier/authmysqlrc

Pour mettre la configuration suivante :

MYSQL_SERVER            localhost
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          pass
MYSQL_DATABASE          postfix
MYSQL_USER_TABLE        mailbox

MYSQL_CRYPT_PWFIELD     password
# MYSQL_CLEAR_PWFIELD    clear

MYSQL_UID_FIELD         5000
MYSQL_GID_FIELD         5000

MYSQL_LOGIN_FIELD       email

MYSQL_HOME_FIELD        "/var/spool/vmail/"

MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')

#Ligne à commenter 
# MYSQL_NAME_FIELD       name

MYSQL_QUOTA_FIELD       quota

Redémarrer le daemon :

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-pop restart

Il peut y avoir une erreur avec les aliases :

rm -f /etc/aliases.db
newaliases
  • Dernière modification: 13/03/2021 07:56