Ceci est une ancienne révision du document !
Comment configurer un hébergement d'email sur un serveur Debian.
Les caractéristiques du serveur mail en bref :
Se base sur le tutoriel Postfix virtual MAILBOX example: separate domains, non-UNIX accounts et Ubuntu.com - PostfixVirtualMailBoxClamSmtpHowto
L'idée est d'avoir un utilisateur (ici vmail) qui va gérer tous les mails. Ils seront stocké selon la hiérarchie suivante :
/home/vmail/
example.com/
alice/
bob/
domain.net/
eve/
Avant de commencer, quelques limites importantes à garder en tête
Pour chacun de vos domaine, créez les records suivants en replaçant l'adresse IP par celle de votre serveur :
example.com MX 1 smtp.example.com smtp.example A 1.2.3.4 imap.example A 1.2.3.4
Postfix est le serveur SMTP.
Le fichier de config principal est /etc/postfix/main.cf
Voici un exemple de fichier fonctionnant, a adapter selon vos besoin.
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/smtpd.crt
smtpd_tls_key_file = /etc/ssl/private/smtpd.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
# remplacer par votre domaine
myhostname = smtp.example
mydomain = example.com
myorigin = $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
# on va utiliser des virtual_mailbox_domains donc pas de domaine ici
mydestination = localhost
relayhost =
# la liste des ip depuis lesquelles on peut accéder au serveur smtp
# on commente car on va utiliser SASL-auth pour contrôler
# mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# 5GB de mailbox max
mailbox_size_limit = 5368709120
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/
# 50MB de piece jointe max
message_size_limit = 52428800
# SASL
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_sasl_security_options = noplaintext,noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-client
# Virtual
# Les domaines depuis lesquels on va recevoir des mails
virtual_mailbox_domains = example.com, domain.net, monsite.org
# Dossier de base de stockage des mails
virtual_mailbox_base = /home/vmail
# C'est là qu'on va stocker la liste des emails
virtual_mailbox_maps = hash:/etc/postfix/vmaps
virtual_minimum_uid = 100
# UID du user et group vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual
# 5GB de taille max des boites virtuelles
virtual_mailbox_limit = 5368709120
En plus du port 25 (non protégé), on veut accéder au mail depuis le port 465 via SSL. Décommentez en plus les lignes suivantes dans le fichier /etc/postfix/master.cf. La première ligne concernant SMTP “simple” doit rester décommentée pour accepter les connexions des serveurs n'utilisant pas SMTPS.
smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
N'oubliez pas d'ouvrir les ports avec iptable
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
C'est l'utilisateur qui gère le tout
groupadd -g 5000 vmail useradd -m -u 5000 -g 5000 -s /bin/bash vmail
Un peu plus loin dans le tuto, on a un script qui rempli ce fichier pour vous mais vous pouvez le remplir à la main maintenant.
alice@example.com example.com/alice/ bob@example.com example.com/bob/ bob@domain.net domain.net/bob/ eve@domain.net domain.net/eve/
Notez qu'on a bob@example.com et bob@domain.net qui pointe vers le même dossier, ainsi bob a deux adresses mails pour le même compte.
Pour générer la base de donnée de vmaps.
postmap /etc/postfix/vmaps
Et on redémarre le serveur !
/etc/init.d/postfix restart
On teste que la réception de mail fonctionne bien
mail alice@example.com Cc: Subject: Un email Ceci est un email <ctrl-d>
Le mail doit être dans /home/vmail/example.com/alice/new/
Dovecot se charge de IMAP. La version 2 de dovecot est nécessaire pour ces règles.
Le fichier de config principal de Dovecot. On va utiliser des fichiers /etc/dovecot/users et /etc/dovecot/passwd qui fonctionnent comme les fichiers /etc/users et /etc/passwd pour les utilisateurs normaux.
## Dovecot configuration file
auth_mechanisms = plain login
auth_username_format = %Lu
base_dir = /var/run/dovecot/
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n
mail_privileged_group = mail
protocols = imap
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
auth_debug = yes
auth_debug_passwords = yes
auth_verbose = yes
verbose_proctitle = yes
mail_debug = yes
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-deliver.log
passdb {
args = /etc/dovecot/passwd
driver = passwd-file
}
service auth {
executable = /usr/lib/dovecot/auth
user = root
}
service imap-login {
chroot = login
executable = /usr/lib/dovecot/imap-login
user = dovecot
}
service imap {
executable = /usr/lib/dovecot/imap
}
valid_chroot_dirs = /var/spool/vmail
auth default {
user = root
socket listen {
client {
# The client socket is generally safe to export to everyone. Typical use
# is to export it to your SMTP server so it can do SMTP AUTH lookups
# using it.
path = /var/spool/postfix/private/auth-client
mode = 0660
user = postfix
group = postfix
}
}
}
auth_mechanisms = plain cram-md5
passdb {
driver = passwd-file
args = /etc/dovecot/passwd
}
userdb {
driver = passwd-file
args = /etc/dovecot/users
}
Plutôt que de tout faire à la main, on va utiliser des scripts pour créer un supprimer des utilisateurs. Ce script va créer des dossiers, ajouter un alias dans vmaps (n'oubliez pas de supprimer les doublons) et enregistrer l'utilisateur dans les deux fichiers adéquats.
Utilisez simplement avec ./newuser.sh alice@example.com
#!/bin/sh
if [ ! $# = 1 ]
then
echo "Usage: $0 username@domain"
exit 1
else
user=`echo "$1" | cut -f1 -d "@"`
domain=`echo "$1" | cut -s -f2 -d "@"`
if [ -x $domain ]
then
echo "No domain given\nUsage: $0 username@domain"
exit 2
fi
echo "Adding user $user@$domain to /etc/dovecot/users"
echo "$user@$domain::5000:5000::/home/vmail/$domain/$user/:/bin/false::" >> /etc/dovecot/users
# Create the needed Maildir directories
echo "Creating user directory /home/vmail/$domain/$user"
# maildirmake.dovecot does only chown on user directory, we'll create domain directory instead
if [ ! -x /home/vmail/$domain ]
then
mkdir /home/vmail/$domain
chown 5000:5000 /home/vmail/$domain
chmod 700 /home/vmail/$domain
fi
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user 5000:5000
# Also make folders for Drafts, Sent, Junk and Trash
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Drafts 5000:5000
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Sent 5000:5000
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Junk 5000:5000
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Trash 5000:5000
# To add user to Postfix virtual map file and relode Postfix
echo "Adding user to /etc/postfix/vmaps"
echo $1 $domain/$user/ >> /etc/postfix/vmaps
postmap /etc/postfix/vmaps
postfix reload
fi
echo "\nCreate a password for the new email user"
#SWAP THE FOLLOWING passwd LINES IF USING A UBUNTU VERSION PRIOR TO 12.04
#passwd=`dovecotpw`
passwd=`doveadm pw -u $user`
echo "Adding password for $user@$domain to /etc/dovecot/passwd"
if [ ! -x /etc/dovecot/passwd ]
then
touch /etc/dovecot/passwd
chmod 640 /etc/dovecot/passwd
fi
echo "$user@$domain:$passwd" >> /etc/dovecot/passwd
exit 0
La même chose pour la suppression, ./deluser.sh alice@example.com
#!/bin/bash
#
# deldovecotuser - for deleting virtual dovecot users
#
if [ ! $# = 1 ]
then
echo -e "Usage: $0 username@domain"
exit 1
else
user=`echo "$1" | cut -f1 -d "@"`
domain=`echo "$1" | cut -s -f2 -d "@"`
if [ -x $domain ]
then
echo -e "No domain given\nUsage: $0 username@domain: "
exit 2
fi
fi
read -n 1 -p "Delete user $user@$domain from dovecot? [Y/N]? "
echo
case $REPLY in
y | Y)
new_users=`grep -v $user@$domain /etc/dovecot/users`
new_passwd=`grep -v $user@$domain /etc/dovecot/passwd`
new_vmaps=`grep -v $user@$domain /etc/postfix/vmaps`
echo "Deleting $user@$domain from /etc/dovecot/users"
echo "$new_users" > /etc/dovecot/users
echo "Deleting $user@$domain from /etc/dovecot/passwd"
echo "$new_passwd" > /etc/dovecot/passwd
echo "Deleting $user@$domain from /etc/postfix/vmaps"
echo "$new_vmaps" > /etc/postfix/vmaps
postmap /etc/postfix/vmaps
postfix reload
read -n1 -p "Delete all files in /home/vmail/$domain/$user? [Y/N]? " DELETE
echo
case $DELETE in
y | Y)
echo "Deleting files in /home/vmail/$domain/$user"
rm -fr /home/vmail/$domain/$user
;;
* )
echo "Not deleting files in /home/vmail/$domain/$user"
;;
esac
;;
* )
echo "Aborting..."
;;
esac
Et on redémarre !
/etc/init.d/dovecot restart
On veut faire le tri des mails via maildrop (alternative à procmail qui n'est plus maintenu).
Installez le paquet maildrop.
Dans /etc/postfix/main.cfg, ajoutez (ou modifier si déjà présentes), les lignes suivantes
virtual_transport = maildrop maildrop_destination_recipient_limit = 1 #mailbox_command = /usr/bin/procmail
Parfois la dernière ligne est décommentée mais il est important qu'on utilise pas procmail ici. On va ensuite configurer les règles dans /etc/postfix/master.cfg. Encore une fois, modifiez les lignes si déjà existantes.
maildrop unix - n n - - pipe
# flags=ODRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
flags=ODRhu user=vmail argv=/usr/bin/maildrop /etc/postfix/maildroprc ${domain} ${user} ${extension} ${recipient} ${user} ${nexthop}
La première ligne commentée est la forme habituelle où l'on utilise l'adresse email complète comme nom de dossier. Cependant ça ne correspond pas à notre structure et l'on aimerait être capable d'utiliser des emails sous la forme user+extension@domaine. On va donc utiliser des règles spécifiées dans /etc/postfix/maildroprc en passant les arguments dans l'ordre d'apparition (les inutilisés sont ignorés).
DEFAULT="/home/vmail/$1/$2"