Tuto serveur de mails sous Debian Etch r5

Voici comment procéder pour mettre en place votre propre serveur de mails sur la distribution stable de Debian. Le serveur est basé sur Postfix, Courier, Mysql et nous aborderons également l’installation d’un webmail avec Squirrelmail.
Tout d’abord installons les paquets dont nous allons avoir besoin:

apt-get install postfix postfix-mysql courier-base courier-imap courier-authdaemon courier-authlib-mysql apache2 php5 phpmyadmin mysql-server mysql-client mailutils

L’installation de Postfix supprimera le MTA d’origine de Debian à savoir Exim4. Vous allez également devoir spécifier la configuration de Postfix sélectionnez site internet avec un smarthost. Quand Courier vous demande s’il doit installer les répertoires pour l’admin web sélectionnez non.
Une fois tous les paquets installés nous attaquons la configuration de notre serveur. Commençons par Postfix. On crée l’utilisateur système qui gérera Postfix:

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

Ensuite on passe à la création des tables de la base de données Mysql (le coeur du système):
Note: attention à ne pas confondre simplequote ‘ et backquote `, et à ne pas oublier le ; à chaque fin d’instruction. La création des tables est à réaliser sur une seule et même ligne ou en frappant la touche entrée à la fin de chaque ligne. Tant que vous ne voyez pas le ; vous continuez à entrer les requêtes telles que vous les lisez.
création de l’utilisateur root:
mysqladmin -u root password votre_mot_de_passe
Ensuite on se connecte sur le serveur:

mysql -p (on ne spécifie pas d’utilisateur puisque nous sommes en root et qu’il n’y a que l’utilisateur root d’enregistré)

On s’attaque maintenant à la partie la plus minutieuse du tuto, la création en ligne de commande de la base et de ses tables:

CREATE DATABASE postfix ;
use postfix ;

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

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 ;

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 ;

Après chaque ; MySql doit vous retourner: Query OK.

Pour des raisons de sécurité, nous allons créer un utilisateur système qui sera dédié à l’utilisation de la base et rien qu’à ça:

GRANT SELECT ON `postfix`.* TO 'monuser'@'%' IDENTIFIED BY 'mot_de_passe' ;
FLUSH PRIVILEGES ;
exit ;

A cette étape la base de données de gestion des utilisateurs et des domaines est créée.
On passe ensuite à la configuration de Postfix:

vim /etc/postfix/main.cf

Vous pouvez copier-coller le mien en adaptant les champs à votre configuration:

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
mailserver:~# cat /etc/postfix/main.cf
smtp_banner = $myhostname ESMTP (Debian / GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes

Vous noterez qu’à la ligne relay host j’ai spécifié smtp.neuf.fr (smarthost) qui est
celui de mon FAI.Si techniquement votre serveur peut envoyer lui même ses mails
directement sur Internet, la plupart des serveurs en facevous jetteront car les
plages d’adresses IP domestiques sont généralement blacklistées.

append_dot_mydomain = no

mydestination = mailserver.technoaddict.fr, localhost.technoaddict.fr, localhost

mydomain = technoaddict.fr

myhostname = mailserver

relayhost = smtp.neuf.fr

mynetworks = 127.0.0.0/8 192.168.0.0/24
inet_interfaces = all

smtpd_sender_restrictions =
permit_mynetworks,
warn_if_reject reject_unverified_sender

smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

smtpd_client_restrictions =
permit_mynetworks

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf, mysql:/etc/pos
tfix/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 = yes
virtual_maildir_limit_message = «  »
virtual_overquota_bounce = yes
myorigin = /etc/mailname
mailbox_size_limit = 1000000
recipient_delimiter = +
inet_protocols = ipv4

On passe ensuite à la création des fichiers cités dans le main.cf. Une fois encore je vous conseille de les copier-coller de les adapter.

vim /etc/postfix/mysql-virtual_mailboxes.cf

hosts = 127.0.0.1
user = monsuser
password = mot_de_passe
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif='1'

vim /etc/postfix/mysql-virtual_aliases_mailbox.cf

hosts = 127.0.0.1
user = monuser
password = mot_de_passe
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif='1'

vim /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

hosts = 127.0.0.1
user = monuser
password = mot_de_passe
dbname = postfix
select_field = quota
table = mailbox
where_field = email

vim /etc/postfix/mysql-virtual_aliases.cf

hosts = 127.0.0.1
user = monuser
password = mot_de_passe
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif='1'

vim /etc/postfix/mysql-virtual_domains.cf

hosts = 127.0.0.1
user = monuser
password = mot_de_passe
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif='1'

On attribue maintenant les droits sur ces fichiers à l’utilisateur que l’on a créé pour la base:

chgrp postfix /etc/postfix/mysql-virtual_*.cf
chmod 640 /etc/postfix/mysql-virtual_*.cf

Vos postfix et base de données sont maintenant opérationnels. On passe désormais à la configuration du serveur Imap Courier:

vim /etc/courier/authdaemonrc

On cherche la ligne commençant par : authmodulelist et on la modifie comme ceci:

authmodulelist="authmysql"

De cette façon on indique à Postfix que l’on souhaite utiliser l’authentification par MySql.

On édite le fichier authmysqlrc (copiez-collez le également et n’oubliez pas d’adapter)

vim /etc/courier/authmysqlrc

##VERSION: $Id: authmysqlrc,v 1.18 2004/11/14 02:58:16 mrsam Exp $
#
# Copyright 2000-2004 Double Precision, Inc. See COPYING for
# distribution information.
#
# Do not alter lines that begin with ##, they are used when upgrading
# this configuration.
#
# authmysqlrc created from authmysqlrc.dist by sysconftool
#
# DO NOT INSTALL THIS FILE with world read permissions. This file
# might contain the MySQL admin password!
#
# Each line in this file must follow the following format:
#
# field[spaces|tabs]value
#
# That is, the name of the field, followed by spaces or tabs, followed by
# field value. Trailing spaces are prohibited.

##NAME: LOCATION:0
#
# The server name, userid, and password used to log in.

MYSQL_SERVER localhost
MYSQL_USERNAME monuser
MYSQL_PASSWORD mot_de_passe

##NAME: MYSQL_SOCKET:0
#
# MYSQL_SOCKET can be used with MySQL version 3.22 or later, it specifies the
# filesystem pipe used for the connection
#
# MYSQL_SOCKET /var/run/mysqld/mysqld.sock

##NAME: MYSQL_PORT:0
#
# MYSQL_PORT can be used with MySQL version 3.22 or later to specify a port to
# connect to.

MYSQL_PORT 0

##NAME: MYSQL_OPT:0
#
# Leave MYSQL_OPT as 0, unless you know what you’re doing.

MYSQL_OPT 0

##NAME: MYSQL_DATABASE:0
#
# The name of the MySQL database we will open:

MYSQL_DATABASE postfix

##NAME: MYSQL_USER_TABLE:0
#
# The name of the table containing your user data. See README.authmysqlrc
# for the required fields in this table.

MYSQL_USER_TABLE mailbox

##NAME: MYSQL_CRYPT_PWFIELD:0
#
# Either MYSQL_CRYPT_PWFIELD or MYSQL_CLEAR_PWFIELD must be defined. Both
# are OK too. crypted passwords go into MYSQL_CRYPT_PWFIELD, cleartext
# passwords go into MYSQL_CLEAR_PWFIELD. Cleartext passwords allow
# CRAM-MD5 authentication to be implemented.

MYSQL_CRYPT_PWFIELD password

##NAME: MYSQL_CLEAR_PWFIELD:0
#
#
#MYSQL_CLEAR_PWFIELD clear

##NAME: MYSQL_DEFAULT_DOMAIN:0
#
# If DEFAULT_DOMAIN is defined, and someone tries to log in as ‘user’,
# we will look up ‘user@DEFAULT_DOMAIN’ instead.
#
#
# DEFAULT_DOMAIN example.com

##NAME: MYSQL_UID_FIELD:0
#
# Other fields in the mysql table:
#
# MYSQL_UID_FIELD – contains the numerical userid of the account
#
MYSQL_UID_FIELD 5000

##NAME: MYSQL_GID_FIELD:0
#
# Numerical groupid of the account

MYSQL_GID_FIELD 5000

##NAME: MYSQL_LOGIN_FIELD:0
#
# The login id, default is id. Basically the query is:
#
# SELECT MYSQL_UID_FIELD, MYSQL_GID_FIELD, … WHERE id=’loginid’
#

MYSQL_LOGIN_FIELD email

##NAME: MYSQL_HOME_FIELD:0
#

MYSQL_HOME_FIELD « /var/spool/vmail »

##NAME: MYSQL_NAME_FIELD:0
#
# The user’s name (optional)

#MYSQL_NAME_FIELD name

##NAME: MYSQL_MAILDIR_FIELD:0
#
# This is an optional field, and can be used to specify an arbitrary
# location of the maildir for the account, which normally defaults to
# $HOME/Maildir (where $HOME is read from MYSQL_HOME_FIELD).
#
# You still need to provide a MYSQL_HOME_FIELD, even if you uncomment this
# out.
#
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,’@’,-1),’/’,SUBSTRING_INDEX(email,’@’,1),’/’)

##NAME: MYSQL_DEFAULTDELIVERY:0
#
# Courier mail server only: optional field specifies custom mail delivery
# instructions for this account (if defined) — essentially overrides
# DEFAULTDELIVERY from ${sysconfdir}/courierd
#
# MYSQL_DEFAULTDELIVERY defaultdelivery

##NAME: MYSQL_QUOTA_FIELD:0
#
# Define MYSQL_QUOTA_FIELD to be the name of the field that can optionally
# specify a maildir quota. See README.maildirquota for more information
#
# MYSQL_QUOTA_FIELD quota

##NAME: MYSQL_AUXOPTIONS:0
#
# Auxiliary options. The MYSQL_AUXOPTIONS field should be a char field that
# contains a single string consisting of comma-separated « ATTRIBUTE=NAME »
# pairs. These names are additional attributes that define various per-account
# « options », as given in INSTALL’s description of the « Account OPTIONS »
# setting.
#
# MYSQL_AUXOPTIONS_FIELD auxoptions
#
# You might want to try something like this, if you’d like to use a bunch
# of individual fields, instead of a single text blob:
#
# MYSQL_AUXOPTIONS_FIELD CONCAT(« disableimap= »,disableimap, »,disablepop3= »,disablepop3, »,disablewebmail= »,disablewebmail, »,sharedgroup= »,sharedgroup)
#
# This will let you define fields called « disableimap », etc, with the end result
# being something that the OPTIONS parser understands.

##NAME: MYSQL_WHERE_CLAUSE:0
#
# This is optional, MYSQL_WHERE_CLAUSE can be basically set to an arbitrary
# fixed string that is appended to the WHERE clause of our query
#
# MYSQL_WHERE_CLAUSE server=’mailhost.example.com’

##NAME: MYSQL_SELECT_CLAUSE:0
#
# (EXPERIMENTAL)
# This is optional, MYSQL_SELECT_CLAUSE can be set when you have a database,
# which is structuraly different from proposed. The fixed string will
# be used to do a SELECT operation on database, which should return fields
# in order specified bellow:
#
# username, cryptpw, clearpw, uid, gid, home, maildir, quota, fullname, options
#
# The username field should include the domain (see example below).
#
# Enabling this option causes ignorance of any other field-related
# options, excluding default domain.
#
# There are two variables, which you can use. Substitution will be made
# for them, so you can put entered username (local part) and domain name
# in the right place of your query. These variables are:
# $(local_part), $(domain), $(service)
#
# If a $(domain) is empty (not given by the remote user) the default domain
# name is used in its place.
#
# $(service) will expand out to the service being authenticated: imap, imaps,
# pop3 or pop3s. Courier mail server only: service will also expand out to
# « courier », when searching for local mail account’s location. In this case,
# if the « maildir » field is not empty it will be used in place of
# DEFAULTDELIVERY. Courier mail server will also use esmtp when doing
# authenticated ESMTP.
#
# This example is a little bit modified adaptation of vmail-sql
# database scheme:
#
# MYSQL_SELECT_CLAUSE SELECT CONCAT(popbox.local_part, ‘@’, popbox.domain_name), \
# CONCAT(‘{MD5}’, popbox.password_hash), \
# popbox.clearpw, \
# domain.uid, \
# domain.gid, \
# CONCAT(domain.path, ‘/’, popbox.mbox_name), \
#  », \
# domain.quota, \
#  », \
# CONCAT(« disableimap= »,disableimap, »,disablepop3= », \
# disablepop3, »,disablewebmail= »,disablewebmail, \
# « ,sharedgroup= »,sharedgroup) \
# FROM popbox, domain \
# WHERE popbox.local_part = ‘$(local_part)’ \
# AND popbox.domain_name = ‘$(domain)’ \
# AND popbox.domain_name = domain.domain_name

##NAME: MYSQL_ENUMERATE_CLAUSE:1
#
# {EXPERIMENTAL}
# Optional custom SQL query used to enumerate accounts for authenumerate,
# in order to compile a list of accounts for shared folders. The query
# should return the following fields: name, uid, gid, homedir, maildir, options
#
# Example:
# MYSQL_ENUMERATE_CLAUSE SELECT CONCAT(popbox.local_part, ‘@’, popbox.domain_name), \
# domain.uid, \
# domain.gid, \
# CONCAT(domain.path, ‘/’, popbox.mbox_name), \
#  », \
# CONCAT(‘sharedgroup=’, sharedgroup) \
# FROM popbox, domain \
# WHERE popbox.local_part = ‘$(local_part)’ \
# AND popbox.domain_name = ‘$(domain)’ \
# AND popbox.domain_name = domain.domain_name

##NAME: MYSQL_CHPASS_CLAUSE:0
#
# (EXPERIMENTAL)
# This is optional, MYSQL_CHPASS_CLAUSE can be set when you have a database,
# which is structuraly different from proposed. The fixed string will
# be used to do an UPDATE operation on database. In other words, it is
# used, when changing password.
#
# There are four variables, which you can use. Substitution will be made
# for them, so you can put entered username (local part) and domain name
# in the right place of your query. There variables are:
# $(local_part) , $(domain) , $(newpass) , $(newpass_crypt)
#
# If a $(domain) is empty (not given by the remote user) the default domain
# name is used in its place.
# $(newpass) contains plain password
# $(newpass_crypt) contains its crypted form
#
# MYSQL_CHPASS_CLAUSE UPDATE popbox \
# SET clearpw=’$(newpass)’, \
# password_hash=’$(newpass_crypt)’ \
# WHERE local_part=’$(local_part)’ \
# AND domain_name=’$(domain)’
#

Enfin on édite le fichier Imapd et on modifie tout à la fin :

MAILDIR=Maildir
MAILDIRPATH=homedir

On aujoute maintenant un utilisateur du serveur de messagerie toujours en ligne de commande:

# mysql -u root -p
use postfix ;
INSERT INTO domain (domain, actif) VALUES ('votre_domaine.com', '1') ;
INSERT INTO mailbox (email,password,quota,actif,imap,pop3) VALUES ('utilisateur@domaine.com',ENCRYPT('mot_de_passe_messagerie'),0,1,1,1) ;
exit ;

On redémarre tous les services:

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

Les redémarrages ne doivent pas générer d’erreurs.
Avant de mettre les boîtes créées en production, il faut envoyer un mail de test en local afin que l’arborescence se crée. Sous peine d’avoir un message d’erreur pour l’expéditeur à l’expédition du premier mail, la boîte n’existant pas:

mail monuser@domaine.com
To : user@nom_domaine.com
texte
.

on termine chaque ligne par entrée et le . signifie que le mail peut être envoyé. Surveillez les logs et rendez-vous dans /var/spool/vmail/mondomaine.com/monuser/new pour y voir le mail.
editez le si vous le souhaitez par:

cat 32636728........

On termine par l’installation de squirrelmail :

apt-get install squirrelmail

Il n’y a rien à modifier il fonctionne tout seul. Juste un lien symbolique facilitant l’adresse url:

ln -s /usr/share/squirrelmail /var/www/webmail

Vous pouvez vous loguer dessus à:

http://url_serveur_mail_ou_ip/webmail

Pour l’administration de la base de données vous pouvez désormais utiliserr phpmyadmin:

http://url_serveur_mail_ou_ip/phpmyadmin

Il ne vous reste plus qu’à faire pointer le MX de votre choix vers votre IP ou dyndns, et de configurer le client de messagerie avec l’adresse email complète en login.

2 thoughts on “Tuto serveur de mails sous Debian Etch r5

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *