Installation et configuration d’un serveur de messagerie simple avec Postfix et Dovecot

Ce tutoriel aide à l’installation et la configuration d’un serveur de messagerie SMTP et IMAP basé sur Postfix et Dovecot.

Par serveur simple, j’entends par là, pas de SSL, de MySQL et de fonctions avancées. Ces fonctions viendront par la suite dans de prochains articles. La solution proposée est à base de Postfix pour le MTA et Dovecot comme serveur IMAP.

Il gérera des boîtes aux lettres virtuelles – c’est-à-dire indépendantes des comptes systèmes – d’autant d’utilisateurs et de domaines que ce soit.

Pour la suite des opérations, la machine utilisée est sous Fedora, le tutoriel pourra donc convenir aux utilisateurs de CentOS et de Red Hat. On supposera qu’elle s’appelle monhostname.local.mondomaine.net. C’est parti ^.^



Postfix

L’installation se fait naturellement avec yum :

# yum install postfix

Afin de préparer le terrain, il faut créer l’arborescence qui accueillera les boîtes aux lettres virtuelles et l’utilisateur/groupe de celles-ci. Pour ce faire, ajouter un utilisateur vmail et un groupe du même nom ayant tout deux des uid et gid non réservés, par exemple 6000. Le home de cet utilisateur sera /home/vmail, c’est ici que les BAL seront construites :

# groupadd -g 6000 vmail
# useradd -d /home/vmail -m -u 6000 -g 6000 -s /dev/null vmail

On change les droits et le propriétaire des répertoires pour plus de sécurité :

# chmod -R 750 /home/vmail/
# chown -R vmail:vmail /home/vmail/

Les fichiers de configuration Postfix se situent sous /etc/postfix et c’est main.conf qui nous intéresse. Je vais juste copier-coller le mien ci-dessous, pour plus de renseignement sur ses paramètres, voir cet article.

alias_database = $alias_maps
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
delay_warning_time = 4h
html_directory = no
inet_interfaces = all
mail_owner = postfix
mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
mailbox_size_limit = 512000000
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
masquerade_domains = mondomaine.net
message_size_limit = 50000000
mydestination = $myhostname, localhost.$myhostname, localhost
mydomain = mondomaine.net
myhostname = monhostname.local.mondomaine.net
mynetworks = 192.168.1.0/24, 127.0.0.0/8
myorigin = $myhostname
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
recipient_delimiter = +
relayhost = [smtp.sfr.fr]
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
smtp_generic_maps = hash:/etc/postfix/generic
smtpd_banner = $myhostname ESMTP
smtpd_recipient_limit = 50
unknown_local_recipient_reject_code = 550
virtual_alias_maps = hash:/etc/postfix/user_aliases
virtual_gid_maps = static:6000
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = /etc/postfix/domains
virtual_mailbox_limit = 512000000
virtual_mailbox_maps = hash:/etc/postfix/user_mailboxes_path
virtual_minimum_uid = 6000
virtual_uid_maps = static:6000

Astuce : Si comme moi, le serveur est sur un domaine local (monhostname.local.mondomaine.net), quelques difficultés vont être rencontrées lors de l’envoi de message vers l’extérieur, la machine de relai [smtp.sfr.fr] va refuser d’acheminer les emails car le domaine n’est pas enregistré sur la toile : Sender address rejected: Domain not found. Pour remédier à cela, il faut substituer l’adresse de l’émetteur en ajoutant ceci dans /etc/postfix/generic :

@monhostname.local.mondomaine.net       @mondomaine.net

On compile ce fichier avec postmap avant de relancer Postfix :

# postmap /etc/postfix/generic

Pour savoir où délivrer le courrier, le système va lire le nom des domaines virtuels gérés dans le fichier domains et les adresses emails ainsi que leur chemin seront dans user_mailboxes_path, tout deux toujours sous /etc/postfix. Il suffit d’ajouter des domaines séparés par des retours ligne, comme suit :

mondomaine.net
monautredomaine.com

Et pour les boîtes aux lettres virtuelles :

tutu@mondomaine.net mondomaine.net/tutu/
toto@monautredomaine.com monautredomaine.com/toto/

Noter le / (slash) de fin important pour indiquer qu’il s’agit de boîtes au format Maildir.

On ajoute un alias pour par exemple rediriger le courrier de toto@monautredomaine.com vers l’adresse tutu@mondomaine.net dans user_aliases :

toto@monautredomaine.com tutu@mondomaine.net

Et pour fignoler, on redirige le courrier de root – qui arrive sous /var/mail/root – vers une adresse virtuelle pour que la lecture des courriers important du système soit facilité. Ceci ce fait dans le fichier /etc/aliases :

root: tutu@mondomaine.net

Postfix ne lit pas ce genre de fichier tel quel, il faut comme pour le fichier generic le compiler pour créer le fichier de base de données grâce à la commande postmap, comme ceci :

postmap /etc/postfix/user_mailboxes_path
postmap /etc/postfix/user_aliases

Les alias locaux eux se compilent avec la commande :

newaliases

Une fois les changements effectués, on recharge Postfix :

# service postfix reload

On peut désormais faire un petit essai d’envoi d’email :

# "Email test" | mail -s "Test email root" root

Le message doit arriver dans /home/vmail/mondomaine.net/tutu/new/, l’arborescence étant créée automatiquement par Postfix dès réception de l’email.
A noter qu’il est préférable d’avoir un champ MX mondomaine.net dans vos zones DNS pour que le courrier soit bien acheminé.



Dovecot

Comme le dit le site sur lequel je me suis inspiré, recevoir du courrier c’est bien, pouvoir le lire c’est mieux. Pour cela, il faut installer Dovecot que l’on utilisera en serveur IMAP.

# yum install dovecot

Le fichier de configuration se situant sous /etc/dovecot/dovecot.conf, on l’édite comme suit :

# On veut des BAL IMAP
protocols = imap

# Chemin des les logs
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log

# Je ne veux pas de SSL
ssl_disable = yes
disable_plaintext_auth = no

# Les BAL seront au format Maildir
mail_location = maildir:/home/vmail/%d/%n

# Optimisations
dotlock_use_excl=yes
maildir_copy_with_hardlinks=yes

# Configuration de l'authentification
auth_verbose = yes
auth default {
    mechanisms = plain
    passdb passwd-file {
        # Chemin vers les utilisateurs dovecot (les adresses email gérées)
        args = /etc/dovecot/passwd
    }
    userdb static {
        # Chemin vers les BAL
        args = uid=vmail gid=vmail home=/home/vmail/%d/%n/
    }
}

Maintenant il faut créer les utilisateurs (adresses emails) et les mots de passes associés pour accèder aux BAL dans le fichier /etc/dovecot/passwd :

echo "tutu@mondomaine.net:`dovecotpw -p lemotdepasse`" >> /etc/dovecot/passwd

On démarre Dovecot :

service dovecot start

Et voilà, c’est fini! Il ne reste plus qu’à le tester. On peut commencer par essayer d’accéder à une BAL en telnet sur le port 143 :

$ telnet monhostname.mondomaine.net 143
Trying 127.0.0.1...
Connected to monhostname.mondomaine.net.
Escape character is '^]'.
* OK Dovecot ready.
1 login tutu@mondomaine.net motdepasse

1 OK Logged in.
2 select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.

* 1 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1217314075] UIDs valid

* OK [UIDNEXT 15] Predicted next UID
2 OK [READ-WRITE] Select completed.

3 list "" *
* LIST (\HasNoChildren) "." "Drafts"
* LIST (\HasNoChildren) "." "Sent"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "INBOX"

3 OK List completed.

Si cela fonctionne, vous pouvez essayer avec un vrai client (Thunderbird, Mail.app, Claws Mail, Outlook). Sinon, il faut aller voir d’où vient le problème dans les logs sous /var/log et mieux vaut lire et relire les documentations (voir ci-dessous).


En complément :


Les bases de cet article à l’origine pour Arch Linux datent du 29 juillet 2008, c’est une sorte de re-publication un peu mise-à-jour pour Fedora et un transfert de Joomla vers WordPress.

8 pensées sur “Installation et configuration d’un serveur de messagerie simple avec Postfix et Dovecot”

  1. Merci pour ces 3 articles très intéressants, leur aide m’a été précieuse !
    Une petite coquille par contre il me semble, dans le paragraphe sur postfix : c’est plutôt /etc/postfix/virtual d’après le fichier de conf plus haut ?

  2. Merci pou le tuto tai un chef !! nserais t’il possible d’avioir le nouvel article s’il est déja rédigé. merci et bon boulo….

  3. J’ai lu je ne sais pas combien de « tutos » sur postfix+dovecot. Dans la majorité des cas, ce n’était que des fichiers de configuration à recopier. On ne comprend rien, ça ne fonctionne jamais, et il étaient évidement tous uniquement adaptés à un cas précis. Avec celui ci, l’installation à fonctionné du premier coup. Et surtout, surtout, on *comprend* ce que l’on fait et pourquoi on le fait. Un très grand merci :)

      1. Effectivement, j’ai du adapter quelques petites choses pour dovecot, certaines directives de configurations ont étés modifiés avec les versions récentes. Mais j’ai pu le faire car cet article permet au lecteur de comprendre ce qu’il est en train de faire. Quand on comprend ce qu’on souhaite faire, comment on veut que les choses fonctionnent etc, il devient beaucoup plus simple de lire les logs et la doc pour trouver ce que l’on cherche…

        J’ai maintenant une configuration simple postfix/dovecot/roundcube qui fonctionne. Il ne me reste plus qu’a lire les autres billets de la série pour finaliser (notamment le chiffrement et anti spam). Je suis sur que je vais encore apprendre plein de choses dans les jours qui viennent :) Encore merci.

    1. Juste une chose qu’il faudrait modifier : la commande dovecotpw n’existe plus. Il faut passer par l’outil : doveadm. Exemple : doveadm pw -s SHA1

Laisser un commentaire

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