postfix : serveur mail smtp

Objet : configuration de postfix pour une gestion multi-domaines via MySQL.

Niveau requis :

Commentaires : Vous voulez gérer les comptes mails de différents domaines via postfix.

Suivi :

Création par stopher le 23-3-2009

Testé par <...> le <...>

Commentaires sur le forum : ici1) N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !

Introduction

Ce tutoriel présente comment monter un serveur de mail multi-domaines géré par une base mysql et administré par postfixadmin, activation du mode vacation (répondeur automatique)

Installations

MySQL

Pour installer le serveur mysql, il faut juste entrer la commande suivante :

apt-get install mysql-server

Postfix

Pour installer postfix et les modules nécessaire pour la gestion via mysql, entrez cette commande :

apt-get install postfix postfix-mysql

Si des questions vous sont posées, répondez par défaut, de toute manière les options sont modifiées plus bas

Dovecot

Pour installer dovecot, entrez cette commande :

apt-get install dovecot-common dovecot-imapd dovecot-pop3d

Configuration

Configuration de postfix

Là on a fait le plus simple... reste à configurer le tout... Première étape, créer l'utilisateur et le groupe utilisés par postfix :

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Ensuite on s'attaque au fichier de configuration de postfix à savoir : /etc/postfix/main.cf

Les versions récentes de debian offrent un canevas de ce fichier sous le nom main.cf.proto. Faites-en une copie

cp /etc/postfix/main.cf.proto /etc/postfix/main.cf nano /etc/postfix/main.cf

Dans ce fichier, les options à modifier/ajouter sont : Nom d'hôte du serveur, veiller à ce que ce nom soit fqdn et qu'il soit existant dans le domaine (reverse dns)

myhostname=mailhost.lindev.fr

Destinations locales gérés par postfix. Attention à ne pas mettre un domaines que vous allez gérer virtuellement

mydestination=mailhost.lindev.fr, localhost.lindev.fr, localhost

Permet de définir un relais pour vos mails sortant exemple : [smtp.nordnet.fr] vide par défaut

relayhost=

mynetworks permet de définir (le) les réseaux qui sont autorisés à envoyer des mails

mynetworks=127.0.0.0/8 10.0.0.0/24

mydomain permet de définir le domaine internet du système de messagerie

mydomain=lindev.fr

home_mailbox définit le chemin optionnel d'un fichier de boîte-aux-lettres relatif au répertoire personnel d'un utilisateur

home_mailbox=/

smtpd_recipient_restrictions permet d'ajouter des restrictions sur les mails entrant

smtpd_recipient_restrictions=
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_non_fqdn_sender,
reject_unknown_recipient_domain,
reject_invalid_helo_hostname,
reject_unlisted_recipient,
reject_unlisted_sender,
reject_non_fqdn_helo_hostname,
reject_rbl_client list.dsbl.org,
reject_rhsbl_sender dsn.rfc-ignorant.org

message_size_limit correspond à la taille maximale d'un message en octets

message_size_limit=10240000

Repérez la ligne setgid_group et modifiez-la comme suit:

setgid_group = vmail

Voilà pour les principaux paramètres à modifier, nous allons maintenant lier postfix à la base mysql.

Pour lier postfix à la base, nous allons créer trois fichiers :

mysql-virtual-mailbox-domains.cf

mysql-virtual-mailbox-maps.cf

mysql-virtual-alias-maps.cf

Le premier correspond à la gestion des noms de domaine, le second gère les boites des utilisateurs, et le troisième gère les alias.

Contenu de ces trois fichiers :

user =**votre_utilisateur_de_BD** password =le password de l'utilisateur hosts = 127.0.0.1 dbname = postfix query= SELECT domain FROM domain WHERE domain='%s'
user =votre_utilisateur_de_BD password =le password de l'utilisateur hosts = 127.0.0.1 dbname = postfix query= SELECT maildir FROM mailbox WHERE username='%s' AND active='1'
user =votre_utilisateur_de_BD password =le password de l'utilisateur hosts = 127.0.0.1 dbname = postfix query= SELECT goto FROM alias WHERE address='%s'

Pour chaque fichier, nous allons exécuter la commande postmap :

postmap /etc/postfix/mysql-virtual-mailbox-domains.cf
postmap /etc/postfix/mysql-virtual-mailbox-maps.cf
postmap /etc/postfix/mysql-virtual-alias-maps.cf

Ensuite, nous retournons dans le fichier de configuration de postfix pour lui demander d'utiliser ces fichiers, vous devez donc ajouter dans ce fichier (/etc/postfix/main.cf) les lignes suivantes :

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/vmail

Et voilà c'est terminé pour postfix !

Configuration de dovecot

Très rapide et très simple, voici le fichier à modifier : /etc/dovecot/dovecot.conf Les lignes à vérifier/modifier sont :

protocols = imap pop3 imaps pop3s
listen = [::]
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl_listen = [::]
mail_location = maildir:/home/vmail/%u
mail_privileged_group = vmail
protocol imap {
mail_plugins = quota imap_quota
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
mail_plugins = quota
}
protocol lda {
mail_plugins = quota
}
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
user = root
count = 2
}
dict {
}
plugin {
#exemple pour un stockage de 5Gb par compte et/ou 1000000000000 mails
quota = maildir:storage=5242880:messages=1000000000000
}

Nous n'allons pas détailler chaque ligne, qui sort du but de ce tutoriel, décommentez/ajouter juste ce qu'il faut, et commentez le reste .

Dans cet exemple, un petit plus, la gestion des quotas, qui n'est vraiment pas obligatoire, dans notre cas, le quota est de 5Go ou 1000000000000 Messages par boite .

Passons à la liaison dovecot/mysql :

Commençons par éditer le fichier dovecot-sql.conf :

driver = mysql
connect = host=127.0.0.1 dbname=postfix user=**utilisateur de la bd** password=**mot de passe user bd**
default_pass_scheme = PLAIN-MD5
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u'

Voilà, votre serveur est prêt à l'emploi, il ne reste plus qu'à installer postfixadmin et à remplir la base de données ..

Installation de postfixadmin

Récupérer postfixadmin comme ceci :

wget http://switch.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin_2.3rc2_all.deb

Installer postfixadmin :

dpkg -i postfixadmin_2.3rc2_all.deb

Créer un lien des fichiers de postfixadmin à votre serveur web (dans mon cas /var/www)

ln -s /usr/share/postfixadmin /var/www

Créer l'hôte virtuel dans apache pour vous connecter à postfix admin puis on redémarre apache

service apache2 restart

Configuration de postfixadmin

Éditer le fichier de configuration /var/www/postfixadmin/config.inc.php

nano /var/www/postfixadmin/config.inc.php

Les options à vérifier sont les suivantes (à adapter selon vos souhaits):

$CONF['configured'] = true; $CONF['postfix_admin_url'] = 'http://postfixadmin.lindev.fr'; $CONF['default_language'] = 'fr'; $CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = '< Votre mot de passe de la base >'; $CONF['database_name'] = 'postfix'; $CONF['database_prefix'] = ''; $CONF['encrypt'] = 'md5'; $CONF['domain_path'] = 'NO'; $CONF['domain_in_mailbox'] = 'YES'; $CONF['vacation'] = 'YES'; $CONF['vacation_domain'] = 'autoreply-lindev.fr'; $CONF['vacation_control'] ='YES'; $CONF['vacation_control_admin'] = 'YES'; $CONF['alias_control'] = 'YES'; $CONF['alias_control_admin'] = 'YES'; $CONF['special_alias_control'] = 'NO'; $CONF['alias_goto_limit'] = '0'; $CONF['user_footer_link'] = "http://postfixadmin.lindev.fr/main"; $CONF['show_footer_text'] = 'YES'; $CONF['footer_text'] = 'Return to postfixadmin.lindev.fr'; $CONF['footer_link'] = 'http://postfixadmin.lindev.fr';

Pour les autres options elles sont soit commentées, soit inchangées ( à adapter selon vos besoins).

Ensuite créez une base de donnée pour postfixadmin que j'ai nommé tout le long de ce tutoriel postfix Ainsi que l'utilisateur associé qui possède tout les droits sur cette base.

mysql -u root -p
CREATE DATABASE postfix; GRANT ALL PRIVILEGES ON postfix.* TO @localhost IDENTIFIED BY ''; quit

Et allez sur votre page d'administration, dans le setup (dans mon cas c'est): http://postfixadmin.lindev.fr/setup.php

Si tout est ok et que vous utilisez une vieille version (avant 2.3), renommez le fichier setup.php

mv setup.php setup.php.disable

Voilà, vous pouvez maintenant créer vos comptes/domaines

Dans un premier temps, vous devrez définir le mot de passe pour « setup »

* Ce mot de passe devra être recopié (encrypté), tel que retourné par la page et selon les consignes données

Ensuite vous devrez créer un compte d'administrateur

* Suivez les indications à l'écran

Mise en place du mode vacation

Nous avons activé le mode vacation dans la configuration de postfixadmin, ce qui permet de renvoyer un message automatique d'absence lorsque vous êtes parti en vacances par exemple ...

création de l'utilisateur local vacation

useradd vacation

Modifier la ligne comme ci-dessous dans le fichier /etc/passwd

vacation:x:65501:65501:Virtual Vacation:/nonexistent:/bin/false

Idem pour /etc/group

vacation:x:65501:

Ensuite, créer un dossier pour vacation

mkdir /var/spool/vacation
chown -R vacation:vacation /var/spool/vacation
chmod -R 700 /var/spool/vacation

Copier le script vacation.pl dans le dossier de vacation (/var/spool/vacation)

Vacation.pl

cd /var/spool/vacation
wget http://phpu.lindev.fr/dld.php?i=2509e7ec-f8a0-4dc6-8fda-87997b646d29
chmod 700 vacation.pl

Editer vacation.pl

Modifier les paramètres de connexion à la base de données et installer les modules nécessaires

apt-get install libmail-sendmail-perl libdbd-pg-perl libemail-valid-perl libmime-perl libmime-charset-perl libmime-encwords-perl

Nous devons ensuite modifier le fichier /etc/postfix/master.cf:

Modification de master.cf

Ajouter ces lignes à la fin :

vacation unix - n n - - pipe
flags=DRhu user=vacation argv=/var/spool/vacation/vacation.pl

Modification du main.cf

Enfin, nous allons modifier le fichier /etc/postfix/main.cf en ajoutant cette ligne :

transport_maps = hash:/etc/postfix/transport

nous allons donc créer le fichier /etc/postfix/transport avec le contenu suivant :

autoreply-lindev.fr vacation

Notez que autoreply-lindev.fr correspond à l'option $CONF['vacation_domain'] = 'autoreply-lindev.fr'; de la configuration de postfixadmin.

Activer le fichier transport

postmap /etc/postfix/transport

Et voilà c'est fini le mode vacation est maintenant opérationnel !

Nous allons redémarrer postfix et dovecot via cette commande :

service postfix restart
service dovecot restart

Surveiller les logs

Pour voir les logs en temps réels, nous pouvons utiliser cette commande

tail -f /var/log/mail.log

Conclusion

Vous voilà avec un serveur de mails complet, administrable via une interface web, qui peut gérer plusieurs domaines, et qui permet la gestion des comptes personnalisés.

Sources

Lindev.fr

Articles liés

Sender Rewriting Scheme

Si vous utilisez des alias avec Postfix à destination d’un autre serveur que le vôtre, et que celui-ci respecte les enregistrements Sender Policy Framework (SPF), certains de vos e-mails seront rejetés.

Cet article explique comment mettre en place Sender Rewriting Scheme (SRS) (article en anglais), une solution permettant d’éviter ce genre de blocage : Postfix - Sender Rewriting Scheme