Postfix + MySQL + Courier POP + Courier IMAP + Pop-before-smtp + SquirrelMail

ou comment avoir une usine à gaz à traiter le courrier chez vous...

Auteur : Guillaume Libersat, <glibersat AT linux62.org>

1.Introduction

Dans ce howto, nous allons voir comment installer une solution complète de mail sur votre serveur. Elle comportera un smtp ( Postfix ) utilisant une base de données ( MySQL ), un pop3 ( Courier-pop ), un imap ( Courier-imap ), un système d'authentification smtp ( pop-before-smtp ), et un webmail ( Squirrel Mail ). Cette solution sera multi-domaines, c'est à dire que vous pourrez héberger plus d'un nom de domaine sur votre serveur ( ex : robert.com et alphonse.org ).

2.Prérequis

Je ne détaillerais pas l'installation des logiciels, cela étant propre à chaque distribution.
Vous devez avoir d'installé ( je mets les versions que j'ai utilisé entre crochets ) :

3.Préliminaires

La base de données doit être lancée, et vous devez pouvoir vous connecter dessus en root.
Tous les autres services comme Postfix doivent êtres coupés.

4.Préparation de la base de données pour Postfix

4.1.Création de la base

Voici la base de données que j'utilise. Rien ne vous empêche de la modifier pour l'adapter à vos besoins. Celle-ci permet de gérer différents domaines, et est, je pense, logiquement structurée. Vous pouvez soit la créer manuellement, soit copier ceci dans un fichier texte, puis faire lire le dump à mysql. Je vous conseille de créer un utilisateur "postfix" afin de réduire les risques de sécurité. Cependant, vous pouvez effectuer toutes les opérations suivantes sous le compte "root" dans mysql, tant que vous attribuez les droits de relecture à "postfix" ensuite. Revenons donc à la création, copiez ceci dans un fichier :

#
# Structure de la table `transport`
#

CREATE TABLE transport (
  domain varchar(128) NOT NULL default '',
  transport varchar(128) NOT NULL default '',
  UNIQUE KEY domain (domain)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Structure de la table `users`
#

CREATE TABLE users (
  id varchar(128) NOT NULL default '',
  address varchar(128) NOT NULL default '',
  crypt varchar(128) NOT NULL default '',
  clear varchar(128) NOT NULL default '',
  name varchar(128) NOT NULL default '',
  uid smallint(5) unsigned NOT NULL default '1000',
  gid smallint(5) unsigned NOT NULL default '1000',
  home varchar(128) NOT NULL default '/',
  domain varchar(128) NOT NULL default '',
  maildir varchar(255) NOT NULL default '',
  imapok tinyint(3) unsigned NOT NULL default '1',
  bool1 tinyint(3) unsigned NOT NULL default '1',
  bool2 tinyint(3) unsigned NOT NULL default '1',
  PRIMARY KEY  (id),
  UNIQUE KEY address (address),
  UNIQUE KEY id (id),
  KEY id_2 (id),
  KEY address_2 (address)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Structure de la table `virtual`
#

CREATE TABLE virtual (
  address varchar(255) NOT NULL default '',
  goto varchar(255) NOT NULL default '',
  UNIQUE KEY address (address)
) TYPE=MyISAM;

			

Puis, connectez vous à MySQL ( "mysql -uroot -p", puis tapez votre mot de passe ) et créez une database avec la commande :

create database maildb;

( Dans cet exemple, la database créée sera nommée "maildb" ).

Pour faire lire le fichier que vous venez de faire ( dump.sql par exemple ) à MySQL, tapez dans un shell ceci :

# mysql -uroot -p maildb < dump.sql

Nous allons maintenant créer l'utilisateur "postfix", pour cela, vous devez effectuer ceci dans mysql en "root" :

INSERT INTO user (host, user, password) VALUES('localhost','postfix','');
Query OK, 1 row affected (0.00 sec)

mysql> UPDATE user set password=PASSWORD('monpassword') WHERE user='postfix';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT select, insert, update ON maildb.* TO postfix;
Query OK, 0 rows affected (0.00 sec)

Si cela ne vous a pas retourné d'erreur, votre base de données est maintenant prête à être utilisée par postfix.

4.2.Quelques explications

Voici à quoi correspondent les tables :

Vous avez maintenant votre table de prête, nous allons l'interfacer avec Postfix.

5.Postfix

5.1.Mise en place de Postfix

Par défaut, Postfix utilise des fichiers pour distribuer son courrier. Nous allons donc devoir modifier sa configuration afin d'utiliser les informations de la base de données avant toute distribution. Tous les fichiers cités se trouvent logiquement dans /etc/postfix/.

5.2.Création de comptes

Votre Postfix est donc maintenant interfacé avec MySQL. Vous pouvez le lancer, vérifier les logs s'il n'y a pas de message d'erreur. Si Postfix à l'air de tourner, essayer d'envoyer un mail vers l'extérieur, c'est à dire une adresse hors de votre domaine ( ex : @nerim.fr ). Si cela se passe bien, vous pouvez continuer, sinon, lisez les logs, et essayez de résoudre le problème. Pour envoyer un mail avec votre serveur, configurez votre MUA ( Client Mail ) pour utiliser votre serveur postfix en tant que serveur smtp.
Nous allons donc maintenant créer des comptes, et essayer d'envoyer un mail vers notre domaine. Vous pouvez soit vous débrouiller avec MySQL et la création locale, soit utiliser des scripts que j'ai fais afin de me faciliter la vie ( et libre à vous de les adapter ). L'un des deux scripts permet d'ajouter un domaine, et l'autre d'ajouter un utilisateur dans ce domaine. ( Créez le répertoire "/var/spool/postfix/virtual" si il n'existe pas avant d'utiliser ces scripts ). Ces scripts sont à lancer en root ( ou tout autre utilisateur capable d'écrire dans le dossier "virtual" de postfix. N'oubliez pas de les "chmod +x xxxx.sh" avant de les lancer.

Essayez donc maintenant d'envoyer un mail vers l'utilisateur que vous avez créé. Vous devriez voir apparaître dans les logs une ligne de ce style :

May 20 19:17:00 cyclotron postfix/qmgr[425]: 19C5A33F06: from=<root@gnurus.org>, size=303, nrcpt=1 (queue active)
May 20 19:17:00 cyclotron postfix/virtual[30291]: 19C5A33F06: to=<glibersat@gnurus.org>, relay=virtual, delay=1, status=sent (maildir)

Il est probable que vous obteniez des erreurs. Par chance, elles sont souvent explicites, essayez donc de les corriger ( problème de permission par exemple ). Si cela fonctionne, passez à la suite !

6.Courier POP et IMAP

Maintenant que nous avons notre smtp, il serait utile d'avoir un serveur pop3 et un IMAP afin de pouvoir récupérer nos mails. Nous allons donc mettre en place un serveur pop3 et IMAP avec courier.

6.1.Fichiers communs

La première chose à faire est de dire à courier d'utiliser mysql. Nous allons donc changer le type d'authentification. Cherchez les lignes correspondantes à ces suivantes, et remplacez les par cela ( les fichiers sont en général dans /etc/courier ) :

6.2.Courier POP3

Configurer maintenant le fichier pop3d comme suit :

#Ceci peut changer selon les distributions
prefix=/usr
exec_prefix=/usr
sbindir="/usr/sbin"
PIDFILE=/var/run/courier/pop3d.pid
#---

MAXDAEMONS=40
MAXPERIP=4

AUTHMODULES="authdaemon"
AUTHMODULES_ORIG="authdaemon"

POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
POP3AUTH_ORIG="LOGIN CRAM-MD5 CRAM-SHA1"

POP3AUTH_TLS=""
POP3AUTH_TLS_ORIG="LOGIN PLAIN"

PORT=110
ADDRESS=0 #0 signifie simplement d'écouter sur toutes les interfaces
TCPDOPTS="-nodnslookup -noidentlookup"

POP3DSTART=YES

6.3.Courier IMAP

C'est maintenant au tour du serveur IMAP. Le fichier s'appelle imapd, modifiez le suivant cet exmple :

ADDRESS=0
PORT=143

MAXDAEMONS=40
MAXPERIP=4

PIDFILE=/var/run/courier/imapd.pid

TCPDOPTS="-nodnslookup -noidentlookup"

AUTHMODULES="authdaemon"
AUTHMODULES_ORIG="authdaemon"

IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT"
IMAP_CAPABILITY_ORIG="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"

IMAP_IDLE_TIMEOUT=60

IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"

IMAP_DISABLETHREADSORT=0
IMAP_CHECK_ALL_FOLDERS=0
IMAP_OBSOLETE_CLIENT=0

IMAP_ULIMITD=65536

IMAP_USELOCKS=0

IMAP_EMPTYTRASH=Trash:7

IMAP_MOVE_EXPUNGE_TO_TRASH=0

IMAPDSTART=YES

6.4.Essais

Vous devriez donc maintenant avoir un serveur pop et un serveur imap fonctionnel. Vous pouvez l'essayer en configurant votre MUA en indiquant comme serveur pop3 votre serveur courier. Le login est l'e-mail complet, en effet, vu que notre solution est multi-domaines, il faut pouvoir avoir plusieurs utilisateurs avec le même nom sur plusieurs domaines ( ex : glibersat@gnurus.org et glibersat@linux62.com ). Le login peut être complétement différent de l'e-mail, il suffit de l'indiquer dans la colonne "ID" de la table "USERS" de MySQL. Si vous n'arrivez pas à remonter vos mails, lisez les logs.

7.Pop-before-smtp

Nous avons maintenant un système pratiquement complet. Cependant, si vous souhaitez pouvoir utiliser votre smtp de l'extérieur depuis n'importe où, sans pour autant être floodé de mails de spam jusqu'a saturer votre connexion ( et croyez moi, cela arrive ;-), nous allons devoir mettre un système de sécurité en place. Si vous avez des ips fixes, dans ce cas, rajoutez les dans la configuration de postfix, mais si vous n'en disposez pas, nous allons devoir utiliser pop-before-smtp. Il est aussi possible d'utiliser une authentification pour le smtp, mais c'est cette solution qui sera retenue dans ce howto.
Ce logiciel va en fait intercepter dans vos logs les accès au pop, puis débloquer l'envoi de mails depuis l'ip qui a "poppée". En conséquence, une fois que vous vous aurez récupéré vos mails, vous pourrez en envoyer depuis la même adresse ( bien entendu, pour un temps limité ).
Pop-before-smtp est dit supporter Postfix, cependant, je ne suis pas parvenu à la faire fonctionner par défaut. J'ai donc du modifier /etc/pop-before-smtp/pop-before-smtp.conf ainsi :

pat2 = '^XXXXX$'
pat = '^(... .. ..:..:..) \S+ courierpop3login: LOGIN, user=\S+, ip=\[.......(\d+\.\d+\.\d+\.\d+)\]$'

8.Squirrel Mail

SquirrelMail est une interface en php qui permet de récupérer et envoyer des mails à travers un serveur imap et smtp. Cela peut être utile si vous avez de nombreuses personnes qui vont se connecter depuis des endroits où ils ne peuvent acceder à un MUA ou si simplement vous ne souhaitez pas leur laisser cette liberté.
Nous allons donc voir comment configurer SquirrelMail et Apache.

8.1.SquirrelMail

Les fichiers se trouvent soit dans le répertoire où vous avez décompressé SquirrelMail ou soit dans /etc/squirrelmail/ ( Debian ) :

8.2.Apache

Nous allons maintenant ajouter un chemin virtuel à Apache. Pour cela, créez un fichier apache.conf dans le répertoire de SquirrelMail ( ex : /etc/squirrelmail/ ) contenant ceci :

#Changer le chemin vers le répertoire de squirrelmail
Alias /squirrelmail /usr/share/squirrelmail

<Directory /usr/share/squirrelmail>
php_flag register_globals on
Options Indexes FollowSymLinks
</Directory>

NameVirtualHost *

# users will prefer a simple URL like http://webmail.example.com
<VirtualHost *>
DocumentRoot /usr/share/squirrelmail
ServerName mail.gnurus.org
</VirtualHost>

Ajoutez ensuite ceci dans votre fichier de configuration d'Apache ( /etc/httpd/conf/httpd.conf en général ) :
Include /etc/squirrelmail/apache.conf
Puis, relancez Apache, mais avec un "stop" et "start", et non pas un "restart", pour éviter le "Gracefull Restart".

9.Conclusion

Vous devriez maintenant avoir un système de mail complet digne des FAI ;-). Si vous avez rencontré des problèmes, et/ou si vous en avez encore, n'hésitez pas à me contacter afin d'ajouter vos épreuves à la section problèmes :-). Il ne vous reste plus qu'a faire bon usage de votre système de mails!

10.Problèmes

Q : Quand j'essayes d'envoyer un mail, j'ai cette erreur dans les logs :
May 20 20:37:14 caporal postfix/smtpd[21442]: fatal: open database /etc/aliases.db: No such file or directory
R : créez le fichier /etc/aliases, puis lancez le programme "newaliases".