Exim est un serveur de messagerie électronique. Encore un me direz-vous ? Il y a déjà sendmail, qmail, smail, zmailer, postfix, etc... Eh bien oui, encore un... Pourquoi dédier un article à celui-la et pas à un autre ? Parce qu'Exim possède un certain nombre de qualités qui valent bien un article; d'autre part, parce que ce logiciel de messagerie devient de plus en plus populaire. C'est déjà le mailer installé par défaut sur les systèmes Debian récents. Exim (qui est fourni sous Licence GPL) n'a pas le problème de licence de qmail, est plus humainement configurable que sendmail et est plus mûr que postfix qui est encore très "jeune".
Exim permet également de faire facilement des configurations très complètes. Par facilement, je veux vraiment dire facilement, pas "il y a un truc à rajouter dans le ruleset 91, je dois encore avoir quelque part l'email de 3 pages ou Eric Allman explique ça" (ceux qui ont déjà fait des configurations évoluées avec sendmail savent de quoi je veux parler ;).
Exim supporte un grand nombre de méthodes pour récupérer des informations : fichiers texte standard, fichiers DBM, NIS, NIS+, LDAP, cdb, DNS. Chacune de ces méthodes d'accès posséde ses avantages et inconvénients. Dans la configuration qui est présentée ci-dessous, il est fait usage de fichiers DBM, car ils permettent de gérer facilement des tables assez grosses avec des temps d'accès raisonnables. D'autre part, exim fournit la commande exim_dbmbuild qui permet très simplement de transformer des fichiers textes en fichiers DBM.
Dans l'exemple qui suit, les fichiers DBM utilisés sont générés à partir de fichiers texte contenant une entrée par ligne. La seule exception est pour le fichier d'alias, qui est généré à partir d'un fichier comportant deux champs par ligne séparés par un ':'. exim_dbmbuild acceptant également les lignes commençant par le caractère '#', voici à quoi peut ressembler votre fichier /etc/aliases.txt utilisé pour générer aliases.db :
# fichier /etc/aliases.txt
postmaster@pipo.com: vincent
root@pipo.com: vincent
postmaster@autredomain.org: raphael
root@autredomain.org: raphael
help@pipo.com: :blackhole:
attente@pipo.com: :defer:
machin@pipo.com: :fail: Disparu sans laisser d'adresse
Notons au passage 2 points importants :
- Dans notre exemple, nous utilisons l'option "include_domain=true" (voir plus bas) qui permet d'inclure le nom de domaine dans les alias, ce qui permet de gérer facilement plusieurs domaines simultanement dans avoir de problème de "collision" entre les utilisateurs de 2 domaines différents.
- Exim fournit 3 alias spéciaux ; : blackhole : le mail arrivant à cette adresse est ignorée ; : defer : les messages sont mis en attente pour une durée indéterminée (ce qui est parfois très pratique pour "bloquer" les messages pendant que l'on fait des changements importants dans la configuration); : fail : permet quant à lui de prédéfinir un message d'erreur.
Exim fait également partie des rares logiciels à être livrés avec beaucoup de documentations. Cependant, voici quelques astuces de configuration qui pourront vous faire gagner du temps.
Les lignes qui suivent ne sont pas suffisantes pour réaliser une configuration complète d'Exim, mais elles reprennent les astuces les plus utiles et les plus courantes.
identification du système :
primary_hostname = vince.pipo.com
qualify_domain = pipo.com
qualify_recipient = pipo.com
local_domains = "dbm;/var/spool/exim/db/domains.db"
local_domains_include_host = true
local_domains_include_host_literals = true
never_users = root
trusted_users = mail:list:www-data
Configuration anti-spam locale ; junk.db est generé à partir d'une liste d'adresses email contenant éventuellement des wildcards. (*@savetrees.com par exemple).
relay_domains = "dbm;/var/spool/exim/db/domains.db"
sender_reject = "partial-dbm;/var/spool/exim/db/junk.db"
sender_host_reject = "+allow_unknown:\
partial-dbm;/var/spool/exim/db/junk.db"
relay_match_host_or_sender = true
sender_address_relay = "pipo.com:\
partial-dbm;/var/spool/exim/db/domains.db"
On vérifie que les entêtes des messages soient syntaxiquement correctes (cela permet de filtrer un peu plus de spam)
smtp_verify = true
headers_sender_verify = true
headers_check_syntax = true
On bloque la réception des messages au delà d'une certaine taille. 2 Mo est une limite raisonnable (suffisant pour la plupart des fichiers et pas suffisamment gros pour les utilisateurs qui récupérent leurs messages par POP3).
message_size_limit = 2000K
On refuse de recevoir si la charge est supérieure à 3.0 pour ne pas "écrouler" la machine.
smtp_load_reserve = 3.0
Pour filtrer encore un peu plus de spam: utilisation de la RBL
(voir http://maps.vix.com/rbl/ pour plus d'informations)
prohibition_message = contact postmaster@pipo.com for further info
recipients_reject_except = postmaster@pipo.com
rbl_domains = "rbl.maps.vix.com"
rbl_reject_recipients=true
(à ajouter dans la section "directors")
Le director pour la gestion des alias locaux.
system_aliases :
driver = aliasfile;
search_type = dbm,
file = /var/spool/exim/db/aliases.db,
include_domain=true
expand=true
On active la gestion du fichier '.forward' pour chaque utilisateur, ainsi que la reconnaissance des directives de filtrage (voir plus bas).
userforward :
no_verify,
driver = forwardfile;
check_local_user,
group=8,
file = ${home}/.forward,
filter
Les 3 lignes suivantes sont facultatives, mais permettent de "détourner" tous les messages destinés à une adresse inexistantes et d'être reroutés vers une nouvelle adresse au lieu de générer une erreur.
defer_unknown:
driver = smartuser
new_address = postmaster@pipo.com
Pour envoyer du courrier vers l'extérieur, vous avez besoin de l'une des deux sections suivantes :
Celle-ci, si vous envoyez vos messages à travers un relais de messagerie (smarthost) :
smarthost:
driver = domainlist,
transport = smtp;
route_list = "* smtp.mondomaine.net bydns_a"
Celle-là, si votre machine est connectée en permanence à Internet et que vous n'utilisez pas de relais:
lookuphost :
driver = lookuphost,
transport = smtp;
Exim permet également de donner des régles de réécriture d'entêtes de messages (les expressions régulières utilisées par Exim sont compatibles avec les expressions régulières Perl).
On peut par exemple, utiliser une régle de réécriture pour remplacer toutes les adresses 'utilisateur@machine.pipo.com' en 'utilisateur@pipo.com':
*@*.pipo.com $1@pipo.com Ffrs
Les filtres
Exim reconnait un format étendu de fichier .forward, qui fournit à chaque utilisateur un moyen puissant de filtrer et trier son mail sans avoir à utiliser procmail.
Encore une fois, voici un exemple qui vaut mieux qu'un long discours. Sachez cependant qu'Exim est fourni avec une documentation complète et claire sur l'utilisation des filtres.
#Exim filter
if error_message then
save mail/INBOX
# Listes de diffusion Linux
elif $header_to: contains linux or
$header_cc: contains linux then
save mail/IN-linuxlists
elif $header_to: is root@mondomaine.com or
$header_to: is postmaster@mondomaine.com then
save mail/IN-admin
elif $header_to: is moi@ancien-employeur.com then
deliver monremplacant@ancien-employeur.com
else
save mail/INBOX
endif
Par rapport à procmail, les filtres exim ont l'avantage d'avoir une syntaxe plus conviviale et de ne pas nécessiter d'outils supplémentaires. n
Pour plus d'informations, consultez
Homepage d'Exim http://www.exim.org/