Installation et configuration d’un serveur de mail avec postfix et courier

configurer mail serveur dédié

Sommaire

On continue la série de tutoriel vidéo sur les serveurs dédiés (voir le sommaire ici) et cette fois-ci on va voir comment installer un serveur de mail avec le duo gagnants Postfix + Courier.

À la fin de ce tutoriel, vous serez en mesure de gérer plusieurs adresses emails virtuelles (au moins une par nom de domaine) de la forme : [email protected].

On va en profiter pour installer un Webmail pour gérer nos emails (envoie et réception) sur nos différents noms de domaine avec une interface en ligne assez sympa (merci Roundcube) :

En revanche, je ne vous cache pas que c’est probablement le tutoriel le plus compliqué de la série et qu’il y a énormément de choses qui peuvent planter ce qui ne facilite pas le débogage. Mais si vous suivez la vidéo avec attention, tout devrait bien se passer :

Comme d’habitude un petit résumé des grandes étapes avec un bonus à la fin des erreurs les plus courantes et quelques astuces en cas de problème !

Installation de Postfix

L’installation de postfix en elle-même est très simple, il suffit de taper la ligne de commande « apt-get install postfix-mysql » et de choisir « pas de configuration » pendant l’installation.

Les plus curieux d’entre vous auront constatés qu’on installe un paquet un peu spécial de postfix avec une extension « -mysql ». Cette version nous simplifie les choses, on utilisera une base de données MySQL pour stocker nos différents comptes email et noms de domaine.

Création des tables SQL pour Postfix

On a besoin de créer 3 tables pour Postfix :

  1. Une table « domaines » qui contient la liste des noms de domaine hébergés sur le serveur
  2. Une table « comptes » qui contient toutes les adresses emails virtuelle de la forme « [email protected] »
  3. Une table « alias » qui contient différents alias email que nous n’utiliserons pas.

Pour créer ces tables, le plus simple reste de copier/coller ce code SQL dans phpmyadmin. En revanche, vous devez d’abord créer une base de données « postfix » avec un utilisateur « postfix » ayant tout droits sur cette base.

USE postfix;

CREATE TABLE `domaines` (
`domaine` varchar(255) NOT NULL default '',
`etat` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domaine`)
) ENGINE=MyISAM;

CREATE TABLE `comptes` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`etat` 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;

CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`etat` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`source`)
) ENGINE=MyISAM;

Configuration de Postfix pour le lier à la BDD

Maintenant que la base de données est fonctionnelle avec toutes les tables et un utilisateurs valide, nous devons créer 5 fichiers de configurations pour expliquer à Postfix comment utiliser cette base de données. Les fichiers se ressemblent donc faites attention aux erreurs d’inattention :

/etc/postfix/mysql-virtual_domaines.cf

hosts = 127.0.0.1
user = postfix
password = Mot de passe Mysql Postfix
dbname = postfix
select_field = 'virtual'
table = domaines
where_field = domaine
additional_conditions = AND etat=1

/etc/postfix/mysql-virtual_comptes.cf

hosts = 127.0.0.1
user = postfix
password = Mot de passe Mysql Postfix
dbname = postfix
table = comptes
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
where_field = email
additional_conditions = AND etat=1

/etc/postfix/mysql-virtual_aliases.cf

hosts = 127.0.0.1
user = postfix
password = Mot de passe Mysql Postfix
dbname = postfix
table = alias
select_field = destination
where_field = source
additional_conditions = AND etat=1

/etc/postfix/mysql-virtual_aliases_comptes.cf

hosts = 127.0.0.1
user = postfix
password = Mot de passe Mysql Postfix
dbname = postfix
table = comptes
select_field = email
where_field = email
additional_conditions = AND etat=1

/etc/postfix/mysql-virtual_quotas.cf

hosts = 127.0.0.1
user = postfix
password = Mot de passe Mysql Postfix
dbname = postfix
table = comptes
select_field = quota
where_field = email

Une fois terminée, je vous recommande de sécuriser un peu tout cela avec ces lignes de commandes :

Restriction des droits sur les fichiers

Création de l’utilisateur et groupe vmail

Pour avoir une configuration assez propre et sécurisé, nous pouvons créer un utilisateur et un groupe vmail qui se chargera de gérer/stocker les courriels sur le serveurs. Nous devons préciser des UID et GID précis (5000) car nous en auront besoin plus tard dans un fichier de configuration.

Création de l'utilisateur et groupe

Configuration de Postfix

Maintenant on doit configurer le fichier principal de Postfix. Par défaut le fichier est vide, car nous avons choisi « pas de configuration » pendant l’installation. Comme promis dans la vidéo, voici un exemple de fichier de configuration commenter pour vous expliquer les différentes lignes :

# Bannière afficher lorsqu'on se connecte en SMTP sur le port 25
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)

# Service qui envoie des notifications "nouveau message"
biff = no

# Desactive la commande SMTP VRFY. Arrête certaine technique pour avoir des adresses email
disable_vrfy_command = yes

# Impose au client SMTP de démarrer la session SMTP par une commande Helo (ou ehlo)
smtpd_helo_required = yes

# Avec le courier local ça ajoute .NDD aux adresses incomplètes (seulement le nom d'hote)
append_dot_mydomain = no

# Le nom de la machine du système de messagerie
# Par défaut c'est host.domain.tld mais on peut mettre un reverse dns
myhostname = REVERSE_DNS

# Le domaine utilisé par defaut pour poster les message local
myorigin = REVERSE_DNS

# Liste des domaines pour lequel le serveur doit accepter le courrier
mydestination = REVERSE_DNS, localhost.localdomain, localhost

# Pour effectuer des livraisons de courrier avec un relay (ici non)
relayhost =

# Liste des réseaux locaux autorisés
mynetworks = 127.0.0.0/8, IP_PUBLIQUE_SERVEUR

# Taille des boîtes au lettre (0 = illimité)
mailbox_size_limit = 0

# Séparateur entre le nom d'utilisateur et les extensions d'adresses
recipient_delimiter = +

# Interfaces réseaux à écouter (ici toutes)
inet_interfaces = all

# Gestion des boites mails virtuelle
# Contient les fichiers qui permettent de relier postfix mysql
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf,mysql:/etc/postfix/mysql-virtual_aliases_comptes.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domaines.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_comptes.cf

# Le dossier ou seront contenu les mails (=home de l'user vmail)
virtual_mailbox_base = /var/spool/vmail/

# L'id du groupe et de l'utilisateur vmail créé précédement
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# Créer un dossier par comte email
virtual_create_maildirsize = yes

# A activer si vous souhaitez ajouter des quotas
virtual_mailbox_extended = yes

# Impose les limites au niveau des mails, dans notre cas aucune
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_quotas.cf

# Ajouter une limite sur la taille des messages pour les boites virtuelles
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "La boite mail de votre destinataire est pleine, merci de reessayez plus tard."
virtual_overquota_bounce = yes

# adresses d'expedition
smtpd_sender_restrictions =
permit_mynetworks,
warn_if_reject reject_unverified_sender

# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_recipient

# client
smtpd_client_restrictions =
permit_mynetworks

Si vous avez encore des problèmes avec ce fichier, je vous recommande de lire la documentation qui explique tous les paramètres du fichier main.cf.

Une fois cette configuration terminée, vous pouvez redémarrer Postfix et vérifier sa configuration :

Lancement de postfix

Ajout d’adresses email virtuelles

Tout est bon au niveau de postfix, il ne nous reste plus qu’à ajouter un nom de domaine et une adresse email virtuelle dans notre base de données via phpmyadmin. Voilà les codes SQL utilisés dans la vidéo :
Ajouter un nom de domaine

Ajout d'un domaine

Ajouter une adresse virtuelle

Ajout d'une adresse

Un petit test

Il ne nous reste plus qu’à tester notre configuration globale en nous connectant avec telnet sur le port 25 et en envoyant un email. De plus, en envoyant ce premier mail ça va automatiquement créer le dossier pour le nom de domaine dans /var/spool/vmail.

Test en telnet

Si vous n’avez pas d’erreurs, c’est que tout ce passe bien et vous pouvez le vérifier grâce aux fichiers de logs.
Si vous n’arrivez pas vous connecter en telnet, vous pouvez tenter ces lignes de commandes :

Quick fix si telnet ne fonctionne pas

Installation de Courier pour la gestion de l’imap et pop

Maintenant que Postfix est installé et configuré, on a besoin d’installer courier afin de gérer les protocoles pop et imap, qui nous permettent de récupérer nos email via un client comme Thunderbird ou de mettre en place un Webmin comme Roundcube. Voici la liste des paquets à installer :

Installation de courier

Configuration

Nous devons configurer courier afin de préciser qu’on utilise une base de données pour les adresses emails virtuelles. Voici les modifications qu’il faut faire :

/etc/courier/authdaemonrc

On doit ensuite fournir les identifiants de connexion à la base de données et le nom des tables :

/etc/courier/authmysqlrc

Et c’est tout pour la configuration de Courier, il ne nous reste plus qu’à faire un reboot des différents services :

Lancement des daemons

Roundcube

Tout est près, on peut d’ores et déjà récupérer ces emails avec un client comme le célèbre Thunderbird, mais je vous propose d’installer un Webmail qui présente l’avantage d’avoir une interface en ligne.
Commencez par récupérer le lien pour télécharger la dernière version de RoundCube sur cette page (Dans sourcefourge faites un clique droit/copier l’adresse du lien sur le « direct link »).
Ensuite en ligne de commande on télécharge et dé-zippe le fichier avec wget et tar puis on crée un utilisateur pour héberger le code de roundcube :

Récupération de Roundcube

Désormais le code pour Roundcube est disponible dans le dossier /home/roundcube/www (comme pour les autres sites) et donc nous devons créer un fichier virtual host :

/etc/apache2/sites-available/roundcube

<VirtualHost *:80>
ServerAdmin [email protected]
ServerName webmail.ks367082.kimsufi.com
ServerAlias webmail.tutorielvideo.fr
DocumentRoot /home/roundcube/www
# SuexecUserGroup roundcube roundcube # on verra ça plus tard
<Directory /home/roundcube/www>
Options FollowSymLinks
AllowOverride All

Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Maintenant on va créer la base de données pour Roundcube. Connectez-vous sur votre phpmyadmin et créez une base de données Roundcube avec un utilisateur Roundcube qui possède tous les droits sur la base.
Ensuite, on va importer un fichier SQL pour créer les tables nécessaires à Roundcube :

mysql -u root -p roundcubemail < /var/www/webmail/SQL/mysql.initial.sql
BDD Roundcube

Ensuite, vous devez lancer l’installateur de roundcube en allant sur la page http://ksXXXXX.kimsufi.com/~roundcube/installer. Les étapes sont simples à suivre, n’oubliez pas de configurer la base de données.

À l’étape 2, Roundcube vous donnera 2 fichiers de configuration que vous devez créer avec l’éditeur VI par exemple.

Enfin n’oubliez pas de donner les répertoires ~roundcube/www/temp et logs à apache avec un chwon www-data:www-data /home/roundcube/www/temp (et logs).

Maintenant il ne vous reste plus qu’à tester Roundcube en envoyant un email de test et en testant l’imap en donnant l’adresse email virtuelle que vous avez configuré précédemment avec le mot de passe sur le serveur 127.0.0.1.

Erreurs fréquentes

Dans l’installation et la configuration d’un serveur de mail, on peut très facilement se tromper. Pour vous éviter de rechercher des solutions pendant des jours comme je l’ai fait, je vous propose une petite liste d’erreurs que j’ai déjà commise avec leurs solutions. Cette liste pourra éventuellement se mettre à jour en fonction de vos réactions.

J’ai une erreur 500 sur la page Roundcube

Si vous n’arrivez pas accéder à la page d’installation ou d’index de Roundcube et que vous avez une erreur 500, le problème vient probablement du fichier .htaccess. En effet, Roundcube utilise un fichier .htaccess pour redéfinir des règles pour Apache.

Cependant, il faut autoriser l’utilisation de fichier htaccess en plaçant une directive « AllowOverride All » dans le fichier virtual host du site. Il faut également placer cette directive dans le fichier de configuration de UserDir (/etc/apache2/mods-available/userdir.conf).
De toute manière, en faisant un tour dans les logs, on voit tout de suite si le problème vient des htaccess.

Je n’arrive pas me connecter avec Roundcube / L’imap fonctionne pas

Si le test de l’imap à l’étape 3 de l’installation de Roundcube plante ou si vous n’arrivez pas vous connecter avec une adresse email virtuelle, le problème peut venir du fait que le compte email est « vide ».

En effet, pendant le tutoriel nous utilisons telnet pour envoyer un email sur l’adresse fraîchement créé via phpmyadmin. Cela permet de vérifier que tout fonctionne bien, mais cela génère également le dossier qui va contenir tous les emails du domaine dans /var/spool/vmail/. Si ce dossier n’existe pas, vous n’arriverez pas à vous connecter sur votre compte avec Roundcube. La solution est donc de refaire l’étape du telnet et de vérifier que ça génère bien le dossier.

Si en regardant les logs, vous avez une erreur du type « authentification failed » ou un message ressemblant, ça vient probablement du fichier /etc/courier/authmysqlrc. Soit vous avez oublié de commenter la ligne « MYSQL_NAME_FIELD », ou alors vous avez oublié le « MYSQL_MAILDIR_FIELD ».

Je n’arrive pas me connecter en telnet

Si vous n’arrivez pas vous connecter en telnet (si ça freeze), c’est qu’un des fichiers de configuration est mal fait. Vous pouvez le vérifier en regardant dans /var/log/syslog. Si ça ne fonctionne toujours pas, vous pouvez toujours d’arreter postfix et de lancer la commande « newaliases« .

Comment trouver une solution à un problème

Si vous avez un problème qui n’est pas recensé ici, voici quelques pistes pour le trouver. Premier réflexe, si quelque chose ne fonctionne pas -> aller voir les logs.
Voici les fichiers de log intéressant dans ce cas :

  • /var/log/syslog : la plupart des erreurs systèmes sont la dedans
  • /var/log/mail.log : pour tout ce qui concerne les email
  • /var/log/apache2/error.log : toutes les erreurs concernant apache

La plupart du temps vous pouvez identifier le problème et avec une recherche Google (et un peu de logique), on arrive trouver des solutions.

Le tutoriel est enfin terminé, si vous avez des questions ou un prolbème vous pouvez toujours laisser un commentaire. En revanche donnez moi des informations si vous voulez de l’aide (comme les fichiers de logs) car je ne suis pas devin :p.

Si vous me donner des fichiers de log, utilisez un service comme pastebin. Les commentaires de personnes qui donne directement les logs en brut dans les commentaires ne seront pas validés !
Enfin, n’oubliez pas de partarger cet article sur twitter/facebook et de devenir fan de la page en cliquant ici.

(Image à la une : Mail me)