Le cinquième post concerne l’installation et la configuration d’un serveur mail avec postfix, postfix-mysql, dovecot.


Tutoriel utile : http://workaround.org/ispmail/

Voir aussi ce post (installation de postfixadmin et utilisation via postfix) et ce post (mise à jour vers la version 12.04 du serveur mail en fin de post).

  1. Installation de postfix et configuration de postfix-mysql
  2. Configuration des certificats SSL pour postfix
  3. Configuration du serveur IMAP avec dovecot
  4. Configuration du SMTP distant
  5. Configuration de fetchmail pour récupérer ses emails sur un autre serveur mail
  6. Configuration du client pour envoyer/recevoir des emails depuis votre ordinateur personnel
  7. Configuration du webmail roundcube

Installation de postfix et configuration de postfix-mysql

L’installation du serveur mail postfix se fait, en mode super utilisateur, via :

apt-get install postfix postfix-mysql

Lors de l’installation du serveur mail, il faut préciser le nom de domaine de votre serveur ; dans la suite nommé domain-name.org.

La deuxième étape de l’installation consiste à installer et créer la base de données du serveur mail qui contiendra les informations sur les utilisateurs et les noms de domaines du serveur. Sur MySQL (via PhpMyAdmin, par exemple),

  1. créer une base de données nommée maildatabase ;
  2. créer un utilisateur virtuel nommé mailuser avec les privilèges “select” sur la base de données maildatabase ;
  3. trois tables doivent ensuite être créées sur la base de données maildatabase : domains pour les noms de domaine virtuels, users pour les utilisateurs virtuels et aliasespour lister les alias d’adresses. Le code SQL permettant la création de ces trois tables est donné ci-dessous :
    CREATE TABLE `domains` (
         `domain_id` int(11) NOT NULL auto_increment,
         `domain_name` varchar(50) NOT NULL,
         PRIMARY KEY (`domain_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `users` (
         `user_id` int(11) NOT NULL auto_increment,
        `d_id` int(11) NOT NULL,
        `passwd` varchar(32) NOT NULL,
        `user_email` varchar(100) NOT NULL,
        PRIMARY KEY (`user_id`),
        UNIQUE KEY `user_email` (`user_email`),
        FOREIGN KEY (d_id) REFERENCES domains(domain_id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `aliases` (
        `alias_id` int(11) NOT NULL auto_increment,
        `d_id` int(11) NOT NULL,
        `from` varchar(100) NOT NULL,
        `to` varchar(100) NOT NULL,
        PRIMARY KEY (`alias_id`),
        FOREIGN KEY (d_id) REFERENCES domains(domain_id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  4. les informations concernant le serveur sont ensuite à insérer dans les tables correspondantes. Dans la suite, nous prenons l’exemple de deux domaines virtuels : serveur.domain-name.org et domain-name.org et deux deux utilisateurs tuxette@domain-name.org et tuxette@server.domain-name.org tuxette@server.domain-name.org est un alias de tuxette@domain-name.org . Ces données sont insérées dans les tables correspondantes par les requêtes SQL suivantes :
    INSERT INTO `maildatabase`.`domains` (
         `domain_id` ,
         `domain_name`
    )
    VALUES (
         '1' , 'server.domain-name.org'),(
         '2', 'domain-name.org'
    );
    INSERT INTO `maildatabase`.`users` (
         `user_id` ,
         `d_id` ,
         `passwd` ,
         `user_email`
    )
    VALUES (
         '1', '1', MD5('the-first-passwd'), 'tuxette@server.domain-name.org'
         '2', '2', MD5('the-second-passwd'), 'tuxette@domain-name.org'
    );
    INSERT INTO `maildatabase`.`aliases` (
         `alias_id` ,
         `d_id` ,
         `from` ,
         `to`
    )
    VALUES (
         '1', '1', 'tuxette@server.domain-name.org', 'tuxette@domain-name.org'
    );
  5. Il faut ensuite configurer le serveur postfix pour qu’il soit capable de lire ces informations : pour cela, créer un fichier /etc/postfix/mysql-virtual-domains.cfcontenant les informations suivantes :
    user=mailuser
    password=the-mailuser-passwd
    hosts=127.0.0.1
    dbname=maildatabase
    query=SELECT 1 FROM domains WHERE domain_name='%s'

    puis exécuter le script suivant (en super utilisateur) :

    postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-domains.cf

    Vérifier que tout fonctionne par :

    postmap -q domain-name.org mysql:/etc/postfix/mysql-virtual-domains.cf

    qui doit retourner la valeur “1”.
    De même, créer les fichiers /etc/postfix/mysql-virtual-users.cf et /etc/postfix/mysql-virtual-aliases.cf contenant, respectivement,

    user = mailuser
    password = the-mailuser-passwd
    hosts = 127.0.0.1
    dbname = maildatabase
    query = SELECT 1 FROM users WHERE user_email='%s'

    et

    user = mailuser
    password = the-mailuser-passwd
    hosts = 127.0.0.1
    dbname = maildatabase
    query = SELECT to FROM aliases WHERE from='%s'

    puis exécuter les scripts :

    postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-users.cf
    postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-aliases.cf

    Enfin, pour assurer que quelqu’un non autorisé n’aille lire ces fichiers, modifier les propriétaires et droits :

    chgrp postfix /etc/postfix/mysql-*.cf
    chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Enfin, éditez le fichier /etc/postfix/main.cf et régler la taille maximale souhaitée pour les emails (en envoi et réception) :

message_size_limit = 10485760

(pour 10 Mo)

Configuration des certificats SSL pour postfix

Afin d’assurer le cryptage des données entre le serveur server.domain-name.org et le client (votre ordinateur personnel), des certificats de sécurité SSL sont mis en place. Ceux-ci sont générés comme décrit dans ce post et postfix est configuré pour utiliser ces certificats en exécutant les lignes de commande suivantes :

postconf -e "smtpd_tls_key_file = /etc/ssl/private/apache-enc-key.pem"
postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/apache-cert.pem"
postconf -e "smtpd_tls_CAfile = /usr/share/ca-certificates/self/root-cacert.crt"
postconf -e "smtpd_tls_received_header = yes"
postconf -e "mydomain = domain-name.org"
postconf -e "myorigin = server.domain-name.org"
postconf -e "myhostname = server.domain-name.org"
postconf -e "mydestination = server.domain-name.org, localhost"

À ce stade, vous pouvez vérifier l’état de la configuration par :

/etc/init.d/postfix start

ou

/etc/init.d/postfix reload

si postfix était déjà démarré. Le serveur doit démarrer sans erreur…

Configuration du serveur IMAP avec dovecot

Dovecot est installé par :

apt-get install dovecot-imapd

La configuration de dovecot est ensuite effectuée comme suit :

  1. un groupe et un utilisateur mailusersont créés qui seront les seuls à avoir des droits sur les boîtes mail virtuelles (pour assurer la confidentialité des données :
    groupadd -g 5000 mailuser
    useradd -g mailuser -u 5000 mailuser -d /var/vmail -m
  2. Le dossier dans lesquels les boîtes mail virtuelles seront stockées est ensuite créé (dans /home/mail) et les droits sur ces dossier sont donnés à l’utilisateur mailsuser:
    mkdir /home/mail
    chown -R mailuser:mailuser /home/mail
    chmod 740 -R /home/mail
  3. Le fichier /etc/dovecot/dovecot.confest édité pour
    • assurer l’utilisation obligatoire de imaps (qui est la version sécurisée de imap). Pour cela, la ligne protocols = imap imaps est commentée et remplacée par la ligne protocols = imaps.
    • préciser le dossier contenant les emails virtuels : mail_location = maildir:/home/mail/%d/%n/Maildir qui assure que les emails pour l’utilisateur tuxette@domain-name.org seront stockés dans le dossier /home/mail/domain-name.org/tuxette/Maildir
    • configurer les certificats de sécurité pour imaps :
      ssl_ca_file = /usr/share/ca-certificates/self/root-cacert.crt
      ssl_cert_file = /etc/ssl/certs/dovecot-cert.pem
      ssl_key_file = /etc/ssl/private/dovecot-enc-key.pem
      ssl_verify_client_cert = no
      verbose_ssl = yes
    • autoriser dovecot à utiliser la base de données postfix en décommentant la ligne passdb sqlet en ajoutant
      userdb static {
      args = uid=5000 gid=5000 home=/home/mail/%d/%n/Maildir allow_all_users=yes
      }
    • permettre la communication entre dovecot et postfix en ajoutant les lignes suivantes :
      socket listen {
      master {
      path = /var/run/dovecot/auth-master
      mode = 0600
      user = mailuser
      }
      
      client {
      path = /var/spool/postfix/private/auth-client
      mode = 0660
      user = postfix
      group = postfix
      }
      }
      
      protocol lda {
      auth_socket_path = /var/run/dovecot/auth-master
      postmaster_address = tuxette@domain-name.com
      log_path =
      }

      Commenter également la partie « passdb pam » pour éviter les erreurs d’authentification pam (que l’on n’utilise pas) dans le fichier de log.</li> </ul> </li>

    • Dovecot est ensuite configuré pour pouvoir utiliser la base de données MySQL : le fichier /etc/dovecot/dovecot-sql.confest édité de la manière suivante :
      driver=mysql
      connect = host=127.0.0.1 dbname=maildatabase user=mailuser
        password=the-mailuser-passwd
      default_pass_scheme = PLAIN-MD5
      password_query = SELECT user_email as user, user_passwd FROM users
        WHERE user_email='%u';
    • Les derniers points de sécurité sont ajoutés en définissant les droits sur les fichiers de configuration de dovecot :
      chgrp usermail /etc/dovecot/dovecot.conf
      chmod g+r /etc/dovecot/dovecot.conf
      chown root:root /etc/dovecot/dovecot-sql.conf
      chmod go= /etc/dovecot/dovecot-sql.conf
    • Dovecot et postfix sont ensuite respectivement configurés pour communiquer entre eux :
      • pour dovecot, le fichier /etc/dovecot/master.cfest édité et les lignes suivantes sont ajoutées :
        dovecot unix - n n - - pipe
        flags=DRhu user=usermail:usermail argv=/usr/lib/dovecot/deliver
          -f ${sender} -d ${recipient}
      • pour postfix, les lignes suivantes sont exécutées :
        postconf -e virtual_transport=dovecot
        postconf -e dovecot_destination_recipient_limit=1

      et la configuration est testée en relançant dovecot et postfix :

      /etc/init.d/dovecot restart
      /etc/init.d/postfix restart

      Pour tester la réception des emails et leur tri en local, on lance les commandes suivantes :

      find /home/mail
      echo test | mail tuxette@domain-name.org
      find /home/mail

      la deuxième commande find doit faire apparaître la création du dossier mail virtuel pour l’utilisateur tuxette@domain-name.org dans lequel le message test a été stocké.</li>

    • Si le test précédent est un succès, il est temps de rediriger les mails de votre nom de domaine domain-name.org vers votre serveur (à ce stade, OVH les redirige vers ses propres boîtes mail. Pour cela, se connecter à son manager OVH et cliquer sur “Domaines et champ DNS” ; dans la rubrique “Zone DNS” du domaine concerné, effacer les champs MX existants. Cliquer ensuite sur “Type A” et ajouter un champ comme ci-dessous :sous-domaine : domain-name.org sélectionner une IP : adresse_IP_du_serveur_de_mailCliquez sur “Validez” pour confirmer l’opération. Ensuite, choisissez “Type MX” et ajoutez un champ comme ci-dessous :Sous-domaine : domain-name.org Destination: mail2.domain-name.orgTester la réception d’emails depuis l’extérieur en envoyant un email à votre adresse (dans l’exemple tuxette@domain-name.org) et en exécutant à nouveau la commande
      find /home/mail

      qui doit faire apparaître le nouvel email.</li>

    • Un dernier test de lecture peut être pratiqué avec l’utilitaire mutt :
      • en local en lecture directe : mutt -f /home/mail/domain-name.org/tuxette/Maildir ;
      • en local en lecture imaps : mutt -f imaps://home/mail/domain-name.org/tuxette/Maildir qui doit demander la validation de 2 certificats de sécurité puis le mot de passe de l’utilisateur ;
      • à distance par imaps : mutt -f imaps://tuxette@domain-name.org@domain-name.org qui doit demander la validation de 2 certificats de sécurité puis le mot de passe de l’utilisateur.
    • </ol>

      Configuration du SMTP distant

      Cette partie explique comment configurer postfix pour envoyer des emails depuis une machine distante (votre ordinateur personnel). L’envoi se fera en SMTPs (protocole sécurisé utilisant SSL) via le port 465 pour les utilisateurs listés dans la base de données de postfix.

      1. Éditer le fichier /etc/postfix/main.cfet y faire figurer les informations suivantes :
        smtpd_sasl_type=dovecot
        smtpd_sasl_path=private/auth
        smtpd_sasl_auth_enable=yes
        smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated
          reject_unauth_destination
        smtpd_use_tls=yes
        smtpd_tls_auth_only=yes
        smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
        smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

        qui permet les envois selon les conditions suivantes : en local toujours, à distance si l’utilisateur est authentifié. Ces paramètres obligent l’authentification via le protocole TLS qui sécurise les échanges par la mise en place d’un cryptage SSL. Ainsi, l’utilisateur commence par négocier l’établissement de la connexion sécurisée TLS (et doit donc accepter le certificat de sécurité SSL) puis envoie son login et son mot de passe via cette connexion sécurisée. Il peut ensuite envoyer un email.</li>

      2. Le serveur doit ensuite accepter les envois via le port 465 (car ce port est généralement utilisée pour les connexions sécurisées : il est probable que vous puissiez l’utiliser à peu près avec n’importe quelle connexion internet, contrairement au port 25) : pour cela, il faut éditer le fichier /etc/postfix/master.cf et décommenter la ligne commençant par “submission” ainsi que la ligne commençant par “smtps”. Une fois ces réglages effectués, redémarrer postfix :
        /etc/init.d/postfix restart
      3. Finalement, on teste l’envoi d’emails à distance. La première chose pour ce faire est de récupérer l’encodage en base64 des informations de connexion (login utilisateur et mot de passe) :
        perl -MMIME::Base64 -e 'print
          encode_base64("\000tuxette\@domain-name.org\000the-first-passwd")'

        qui renvoie une chaîne de caractères du type :

        AHR1eGV0dGVAZG9tYWluLW5hbWUub3JnAHRoZS1maXJzdC1wYXNzd2Q=

        que l’on note soigneusement pour la suite.
        On commence ensuite par vérifier que le serveur accepte l’authentification via TLS :

        telnet mail2.domain-name.org 465

        ce à quoi le serveur doit répondre

        Trying xx.xx.xx.xx...
        Connected to mail2.domain-name.org.
        Escape character is '^]'.
        220 server.domain-name.org ESMTP Postfix (Ubuntu Lynx)

        On envoie alors la commande EHLO pour se connecter au serveur :

        EHLO example.com

        à laquelle le serveur répond

        250-server.domain-name.org
        250-PIPELINING
        250-SIZE 10485760
        250-VRFY
        250-ETRN
        250-STARTTLS
        250-ENHANCEDSTATUSCODES
        250-8BITMIME
        250 DSN

        Par la ligne “STARTTLS”, le serveur indique que la connexion via TLS est autorisée. On tape

        quit

        pour quitter telnet et faire un essai d’envoi d’email sécurisé. Celui-ci est effectué en lançant la commande

        openssl s_client -starttls smtp -crlf -connect mail2.domain-name.org:465

        Le serveur commence par envoyer le certificat de sécurité pour négocier le cryptage de la connexion. Envoyer alors la commande EHLO

        EHLO example.com

        à laquelle le serveur répond

        250-server.domain-name.org
        250-PIPELINING
        250-SIZE 10485760
        250-VRFY
        250-ETRN
        250-AUTH PLAIN
        250-ENHANCEDSTATUSCODES
        250-8BITMIME
        250 DSN

        L’authentification est autorisée (“AUTH PLAIN”) ; on lance donc celle-ci :

        AUTH PLAIN AHR1eGV0dGVAZG9tYWluLW5hbWUub3JnAHRoZS1maXJzdC1wYXNzd2Q=

        à laquelle le serveur doit répondre

        235 ok, go ahead (#2.0.0)

        On peut alors tester l’envoi d’un email :

        mail from: 
        250 ok
        rcpt to: 
        250 ok
        data
        354 go ahead
        From: Moi 
        To: Personne 
        Subject: Rien du tout...
        Salut!
        .
        250 ok 1113954693 qp 29052
        quit
        221 server.domain-name.org NO UCE

        Si dans la partie “rcpt to:”, vous précisez une adresse email valide, le serveur doit envoyer l’email qui doit être reçue dans la boîte mail correspondante.

        Ref : http://qmail.jms1.net/test-auth.shtml</li> </ol>

        Configuration de fetchmail pour récupérer ses emails sur un autre serveur mail

        Le programme fetchmail permet de rappatrier votre courrier électronique situé sur un autre serveur mail (par exemple, un compte free comme tuxettechix@free.fr). L’installation de fetchmail est effectuée par :

        apt-get install fetchmail

        et la configuration se fait en créant un fichier .fetchmailrc dans votre dossier utilisateur (/home/tuxette, par exemple). Le fichier contient les informations sur la boîte email dont le courrier doit être récupéré :

        poll pop.free.fr
               proto pop3
               user "tuxettechix@free.fr"
               pass "tuxettechix-passwd"
               is "tuxette@domain-name.org"

        qui indique que le courrier de tuxettechix@free.fr est récupéré pour le compte de l’utilisateur virtuel tuxette@domain-name.org. Avec cette configuration, le courrier électronique n’est pas conservé sur le serveur d’origine (free) ; pour en laisser une copie, ajouter l’option keep. Enfin, régler la confidentialité du fichier .fetchmailrc (qui contient le mot de passe du compte email tuxettechix@free.fr) par :

        chown nathalie:nathalie .fetchmailrc
        cmod 710 .fetchmailrc

        puis démarrez le démon fetchmail

        fetchmail -d 60

        pour relever le courrier toutes les 60 secondes.

        Configuration du client pour envoyer/recevoir des emails depuis votre ordinateur personnel

        Cette partie décrit la configuration pour paramétrer votre client de messagerie préféré pour envoyer et recevoir des emails via le serveur. La configuration de 3 clients de messagerie est décrite :

        • thunderbird (le plus détaillé)
        • apple mail
        • TODO: outlook (au cas très improbable où vous voudriez utiliser ce programme :-p…)

        Configurer thunderbird

        Dans Édition -> Paramètres des comptes, cliquez sur le menu “Gestion des comptes” puis “Ajouter un compte de messagerie” que vous configurer comme sur la figure ci-dessous :

        Lorsque vous validez, thunderbird recherche des serveurs dont le nom correspond à votre adresse électronique. Ne conservez pas les propositions par défaut et cliquez sur “Configuration manuelle” et remplissez les champs comme ci-dessous :

        puis cliquer sur “Re-tester“. Lorsque thunderbird a effectué les vérification, vous pouvez appuyer sur “Créer le compte“. Lors de la première connexion au compte puis lors du premier envoi d’email via le serveur SMTP, il vous sera demandé d’accepter le certificat de sécurité puis de rentrer votre mot de passe (celui de tuxette@domain-name.org dans la base de données postfix). Une fois le compte créé, vous pouvez aller dans les paramètres du compte “Gérer les identités” pour ajouter des identités correspondant à des adresses emails que vous rapatriez sur votre serveur (par exemple, tuxettechix@free.fr). Vérifiez également, dans l’onglet “Serveur sortant” de Édition -> Paramètres des comptes que le serveur smtp utilise le port 465 (sinon modifier ce paramètre) et “Mot de passe normal” pour l’authentification.

        Configurer apple mail

        Cliquer sur l’icône “timbre” dans le menu d’Apple Mail et commencer par donner les spécifications du compte :

        Full name: Tuxette Chix

        Email Address: tuxette@domain-name.org

        Password: the-first-passwd

        Dans la partie “Account Type“, choisir “IMAP” puis

        Description: Domain-Name mail server

        Incomming Mail Server: mail2.domain-name.org

        User name: tuxette

        Password: the-first-passwd

        Cocher la case “Use Secure Socket Layer (SSL)” et choisir comme méthode d’authentification “Password“. Pour configurer ensuite le serveur SMTP, ajoutez dans la partie “Outgoing Mail Server” :

        Description: Domain-Name mail server

        Outgoing Mail Server: mail2.domain-name.org

        cocher “Use authentification” et remplir:

        User: tuxette@domain-name.org

        Passwd: the-first-passwd

        Cocher enfin la case “Use Secure Socket Layer (SSL)“. Au premier redémarrage d’Apple Mail après la création du compte, un message apparaît informant que le certificat n’est pas sécurisé (si vous utilisez un certificat auto-signé, du moins). Cliquez sur “Show Certificate” pour vérifier le certificat en vue de l’approuver. Dans la partie “When using this certificate“, cliquer sur “Always trust” puis cliquer sur “Connect” et “OK” (après avoir entré le mot de passe administrateur de votre mac).

        Il peut s’avérer nécessaire de redémarrer l’ordinateur pour que la configuration fonctionne.

        Configurer Outlook

        Dans “Fichier“, choisir “Ajouter un compte“. Remplir les champs comme suit :

        Nom : Tuxette Chix

        Adresse de messagerie : tuxette@domain-name.org

        Mot de passe : the-first-passwd

        Outlook recherche les paramètres du serveur. TODO

        Configuration du webmail roundcube

        roundcube est un webmail simple qui peut être installé sur votre serveur pour consulter et envoyer vos emails avec un simple navigateur. Il s’installe par :

        apt-get install roundcube roundcube-mysql

        La configuration de roundcube s’effectue de la manière suivante :

        1. Sur le serveur MySQL, créer une base de données “roundcubedb” avec un utilisateur “roundcubeuser” ayant tous les droits sur cette base.
        2. Éditer le fichier /etc/roundcubeet modifier les deux premières lignes pour décommenter les alias. Relancer apache :
          /etc/init.d/apache2 reload

          À ce stade, roundcube est accessible à l’url http://www.domain-name.org/roundcube ou https://www.domain-name.org/roundcube en sécurisé si vous avez configuré les certificats SSL pour apache (ce que je conseille : voir ce post).</li>

        3. Il faut ensuite configurer la connexion de roundcube à la base de données en éditant le fichier /etc/roundcube/debian-db.phpde la manière suivante :
          $dbuser='roundcubeuser';
          $dbpass='roundcubeuser-passwd';
          $basepath='';
          $dbname='roundcubedb';
          $dbserver='localhost';
          $dbport='';
          $dbtype='mysql';
        4. Enfin, il faut permettre à roundcube la connexion au serveur IMAP par le port 993 en éditant le fichier /etc/roundcube/main.inc.phpdans lequel on inscrit :
          $rcmail_config['default_host'] = 'ssl://localhost:993';
        5. </ol>

          </div>