Après avoir trouvé la doc sur Debian et Exim, je me lance dans la config de ce serveur mails.


Je me baserai donc sur les pages de doc que j’avais indiqué dans un billet précédent:
- Handling mail for multiple virtual domains with exim4
- Exim4 Virtual Host on Debian Etch
- Installing and configuring Exim 4 on Debian
- Rejecting viral email at SMTP time with exim4
D’abord sur les 2 premières pages.
L’anti-virus, ce sera pour après.
Ce serveur est un Kimsufi, hébergé chez OVH.
A l’origine ce serveur était en Gentoo, mais connaissant assez bien Debian et pas du tout Gentoo, je l’ai fait reconfigurer en Debian.

Sur ce serveur tourne aussi un serveur Web Apache.
J’ai commencé à développer un site Web sur les PC et les logiciels libres, en particulier Ubuntu :
www.libre-pc.be/
www.libre-pc.com/
Je vais me servir de ces domaines pour configurer et tester le serveur Exim4. J’ai modifié dans le DNS le record MX de ces deux domaines pour qu’il pointe vers notre serveur Exim4.
Si vous avez besoin d’une explication rapide sur les DNS et le MX record, Wikipedia est comme souvent une bonne source d’information.

Exim4 est installé de base dans Debian… Reste à le configurer.
Remarque : Exim peut être installé avec deux types de fichiers de configuration.
- soit toute la configuration est réunie dans 2 ou 3 gros fichiers
- soit Exim créera plusieurs petits fichiers de configurations différents
Cette façon de faire est préférable au niveau compréhension, clarté et il y a moins de risque d’erreur en n’éditeur qu’un petit fichier à la fois.
Le serveur Exim devra gérer plusieurs comptes mails et sur plusieurs domaines.
Pour un serveur Exim4 Multi-Domaines, il faut définir des Virtual Domains.

Le site www.debian-administration.org me donne une bonne explication « Handling mail for multiple virtual domains with exim4″ à ce sujet.
La page « Exim4 Virtual Host on Debian Etch » du site www.ebuntu.org est aussi très instructive. Ces deux pages sont complémentaires et j’ai réellement compris (enfin je crois) après avoir lu les deux.
Dans le dossier /etc/exim4, il faut créer un dossier « virtualhosts » et y mettre un fichier texte par domaine pour lequel Exim devra gérer du courrier.
- cd /etc/exim4
- mkdir virtualhosts
- cd virtualhosts
- touch libre-pc.be
- touch libre-pc.com
J’obtiens donc 2 fichiers vides :
ks12345:/etc/exim4/virtualhosts# ls -l total 0 -rw-r--r-- 1 root root 0 Nov 18 03:24 libre-pc.be -rw-r--r-- 1 root root 0 Nov 18 03:24 libre-pc.com
Pour chaque domaine, il faudra mettre dans son fichier une ligne du genre :
address : username@localhost
Ainsi si j’ai des boites utilisateurs en local sur ce serveur, je mettrais par exemple pour « libre-pc.be »
didier : didier@localhost jean : jean@localhost david : david@localhost
pour « libre-pc.com » je veux réenvoyer le mail vers libre-pc.be.
*: catchall@libre-pc.be
Cela veut dire que tout le courrier envoyé à « didier@libre-pc.be » sera envoyé à la boite mail LOCALE de l’utilisateur « didier » sur le serveur lui-même (localhost).
Par contre, pour « libre-pc.com » tout le mail sera redirigé vers l’autre domaine « libre-pc.be »
REMARQUE : Je vérifierai ce point par après !
Il faut maintenant configurer Exim pour qu’il accepte du courrier de tous les domaines pour les quels on aura créé un fichier dans le dossier « virtualhosts ».
Cela permettra d’ajouter facile des nouveaux domaines mails, sans devoir éditer à chaque fois le fichier de configuration.
Pour le moment, la liste des domaines que Exim accepte est dans son fichier de configuration.
cd /etc/exim4/conf.d/main/ vi 01_exim4-config_listmacrosdefs
On y trouve les lignes :
# Create domain and host lists for relay control # '@' refers to 'the name of the local host' .ifndef MAIN_LOCAL_DOMAINS MAIN_LOCAL_DOMAINS = DEBCONFlocal_domainsDEBCONF .endif domainlist local_domains = MAIN_LOCAL_DOMAINS
Remplacer la dernière ligne par
domainlist local_domains = @:localhost:dsearch;/etc/exim4/virtual
Cela forcera Exim4 à aller chercher la liste des domaines dans le dossier que nous venons de créer.
Il faut maintenant créer un fichier d’Alias pour les Virtuals Domains.
Créer un nouveau fichier :
vi /etc/exim4/conf.d/router/350_exim4-config_vdom_aliases
et y mettre les lignes suivantes :
vdom_aliases:
driver = redirect
allow_defer
allow_fail
domains = dsearch;/etc/exim4/virtual
data = ${expand:${lookup{$local_part}lsearch*@{/etc/exim4/virtual/$domain}}}
retry_use_local_part
pipe_transport = address_pipe
file_transport = address_file
no_more
Il reste évidemment à redémarrer Exim.
/etc/init.d/exim4 restart
Et à vérifier que tout fonctionne comme voulu.
La page « Installing and configuring Exim 4 on Debian » donne des exemples simples pour envoyer des mails depuis la console
Quelques essais :
mail -s 'sujet' adresse@email (terminer par une ligne avec un ".")
On peut envoyer un mail via Exim à une adresse locale :
exim4 -bt local_user@example.com
dans mon cas :
exim4 -bt didier@libre-pc.be
Pour une adresse vers un serveur extérieur :
exim4 -v mailbox_you_can_check@dom.ain From: user@your.domain To: mailbox_you_can_check@dom.ain Subject: Testing exim Testing exim .

Mes essais :
J’essaye en console sur le serveur quelques commandes :
mail -s 'Essais 1' didier@libre-pc.be Bonjour premier essais . Cc:didier.misson@belcenter.comil -s 'Essais 1' didier@libre-pc.be Bonjour premier essais . Cc:didier.misson@belcenter.com
Quelques secondes après, je reçois bien la copie du mail dans mon Thunderbird à la maison.
Donc, la sortie de mail depuis le serveur vers une adresse extérieure fonctionne.
Par contre, rien en local !
Exim4 détecte bien, sur base du record MX que c’est une adresse locale.
mais ensuite, il ne délivre pas le mail.
Analysons le log :
2006-11-21 09:00:25 1GmQYL-0002JY-RE <= root@abcde.be U=root P=local S=340 2006-11-21 09:00:25 1GmQYL-0002JY-RE lowest numbered MX record points to local host: libre-pc.be 2006-11-21 09:00:25 1GmQYL-0002JY-RE == didier@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host 2006-11-21 09:00:26 1GmQYL-0002JY-RE => didier.misson@belcenter.com R=dnslookup T=remote_smtp H=MX01.AS31449.net [217.112.180.111] 2006-11-21 09:00:26 1GmQYM-0005IR-E6 <= <> R=1GmQYL-0002JY-RE U=Debian-exim P=local S=593 2006-11-21 09:00:26 1GmQYL-0002JY-RE Frozen 2006-11-21 09:00:26 1GmQYM-0005IR-E6 => postmaster@abcde.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29] 2006-11-21 09:00:26 1GmQYM-0005IR-E6 Completed
On remarque que :
- le mail est envoyé par root@abcde.be (abcde.be est fictif). C’est logique, j’étais logon en root.
- Le domaine abcde.be comme source du mail, c’est une sorte de domaine par défaut. Il faudra vérifier cela.
- Le MX record de libre-pc.be indique à Exim4 que c’est un domaine local.
- mais il n’arrive pas à le délivrer en local : « 1GmQYL-0002JY-RE Frozen« . Cette référence, c’est bien celle de l’adresse « 1GmQYL-0002JY-RE == didier@libre-pc.be«
- Pour le mail externe, il trouve bien un MX record pour « belcenter.com » et j’ai bien reçu ce mail.
- Exim fait référence au serveur SMTP de OVH, je ne sais pas encore pourquoi.
L’analyse de l’entête du mail reçu dans ma boite Belcenter donne ceci :
Received : from mx01.as31449.net (mx01.as31449.net [217.112.180.111]) by ns2.belcenter.be (8.13.6/8.13.4) with ESMTP id kAL7r8cC001780 for ; Tue, 21 Nov 2006 08:53:08 +0100 Received : from ks12345.kimsufi.com (ks12345.kimsufi.com [87.98.123.123]) by mx01.as31449.net (AS31449.net - MX's GW) with ESMTP id 1A3ABE3E8K for ; Tue, 21 Nov 2006 09:00:25 +0100 (CET) Received : from root by ks12345.kimsufi.com with local (Exim 4.50) id 1GmQYL-0002JY-RE; Tue, 21 Nov 2006 09:00:25 +0100
On voit donc que Exim4 a reçu le mail envoyé par « root », il l’envoie ensuite au serveur mail de Belcenter, qui lui-même le délivre.
Par contre, si je répond à ce mail, il est refusé par Exim :
2006-11-21 08:32:17 H=smtp40.mobistarmail.be [193.252.23.61] F= rejected RCPT : relay not permitted
Pour le moment, notre serveur Exim n’accepte pas de mails venant de l’extérieur, même venant d’un serveur SMTP officiel.
C’est très sécure ! Trop même… Mais nous verrons ce problème par la suite, en évitant bien entendu de devenir un « Open Relay » ouvert à tous les spammeurs !
D’abord, pourquoi aucun mail local n’est délivré ?
Faut-il absolument un MDA ? Ou les mails ne devraient-ils pas arriver dans les boites locales telque « /home/blog/Mail » ?
En essayant d’envoyer un mail avec Exim4 vers un destinataire locale, j’obtiens :
# exim4 -bt didier@libre-pc.be R: dnslookup for didier@libre-pc.be LOG: MAIN lowest numbered MX record points to local host: libre-pc.be (while routing ) didier@libre-pc.be cannot be resolved at this time: lowest numbered MX record points to local host
Pourtant, j’ai bien ceci dans le fichier « libre-pc.be »
ks12345:/etc/exim4/virtualhosts# cat libre-pc.be didier : didier@localhost
Je pense que les problèmes de mails locaux viennent du fait que les boites mails au format maildir ne sont pas créées.
La commande pour les créer existe quand dans le package « courier-base ».
Installons le :
ks12345:~# apt-get install courier-base Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: libfam0c102 Recommended packages: fam The following NEW packages will be installed: courier-base libfam0c102 ...
J’ai maintenant la commande maildirmake qui devrait m’initialiser un dossier au format maildir.
Je l’utilise comme utilisateur, pas en root, puisque je dois initialiser une boite par utilisateur :
maildirmake ~/Maildir/
Effectivement, il m’a créé un dossier « Maildir »
didier@ks12345:~$ cd Maildir/ didier@ks12345:~/Maildir$ ls -l total 12 drwx------ 2 didier didier 4096 2006-11-23 07:21 cur drwx------ 2 didier didier 4096 2006-11-23 07:21 new drwx------ 2 didier didier 4096 2006-11-23 07:21 tmp
Je revérifie la résolution par Exim de mon adresse locale :
exim4 -bt didier@libre-pc.be R: dnslookup for didier@libre-pc.be LOG: MAIN lowest numbered MX record points to local host: libre-pc.be (while routing ) didier@libre-pc.be cannot be resolved at this time: lowest numbered MX record points to local host
Il n’arrive toujours pas à résoudre l’adresse
J’envoie un mail en console vers 3 adresses « didier@libre-pc.be« , « info@libre-pc.be » et « didier.misson@belcenter.com« .
« didier » est local, « info » devrait être renvoyé vers une adresse externe et l’adresse « belcenter.com » est externe.
Je vois ceci dans le log :
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G <= root@coolconcept.be U=root P=local S=344 2006-11-23 07:43:21 1Gn8Ir-0006NP-8G lowest numbered MX record points to local host: libre-pc.be 2006-11-23 07:43:21 1Gn8Ir-0006NP-8G == info@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host 2006-11-23 07:43:21 1Gn8Ir-0006NP-8G lowest numbered MX record points to local host: libre-pc.be 2006-11-23 07:43:21 1Gn8Ir-0006NP-8G == didier@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host 2006-11-23 07:43:21 1Gn8Ir-0006NP-8G => didier.misson@belcenter.com R=dnslookup T=remote_smtp H=MX01.AS31449.net [217.112.180.111] 2006-11-23 07:43:21 1Gn8Ir-0003QC-OK <= <> R=1Gn8Ir-0006NP-8G U=Debian-exim P=local S=660 2006-11-23 07:43:21 1Gn8Ir-0006NP-8G Frozen 2006-11-23 07:43:22 1Gn8Ir-0003QC-OK => postmaster@coolconcept.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29] 2006-11-23 07:43:22 1Gn8Ir-0003QC-OK Completed
Ca ne m’aide pas vraiment…
Je reçois bien le mail externe, celui envoyé à « didier.misson@belcenter.com »,
mais pas de trace des 2 mails « @libre-pc.be »
Malgré que ma boite au format Maildir soit créée, je pense qu’Exim4 n’est pas configuré pour utiliser le format Maildir.
Dans ce cas, il ne trouve pas non plus de boite au format mailbox … et ne peut distribuer le courrier.
Effectivement, dans le fichier « 30_exim4-config_mail_spool« , je vois la ligne
mail_spool: ... file = /var/mail/$local_part
C’est bien une configuration pour le format mailbox ! Ce n’est pas ce que je veux. La configuration correcte est bien expliquée dans ces 2 pages :
Voici ce que le fichier correct :
vi /etc/exim4/conf.d/transport/30_exim4-config_mail_spool
### transport/30_exim4-config_mail_spool
# This transport is used for local delivery to user mailboxes in traditional
# BSD mailbox format.
#
mail_spool:
debug_print = "T: appendfile for $local_part@$domain"
driver = appendfile
# file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
group = mail
mode = 0660
mode_fail_narrower = false
directory = ${home}/Maildir
maildir_format
message_prefix = ""
Un petit restart d’Exim
ks12345:/# /etc/init.d/exim4 restart Restarting MTA: exim4.
Un petit mail vers didier@libre-pc.be …
et ça ne fonctionne toujours pas !
Au lieu d’essayer vers une adresse d’un virtual host, je vais essayer directement en local.
La résolution se fait correctement :
ks12345:/var/log/exim4# exim4 -bt didier@localhost R: system_aliases for didier@localhost R: userforward for didier@localhost R: procmail for didier@localhost R: maildrop for didier@localhost R: local_user for didier@localhost
J’envoie un mail vers didier@localhost mais je ne reçois toujours rien.
Je regarde le log :
2006-11-23 08:18:13 1Gn8qb-00013R-6I <= root@abcde.be U=root P=local S=313 2006-11-23 08:18:13 1Gn8qb-00013R-6I == didier@localhost R=local_user T=mail_spool defer (13): Permission denied: creating lock file hitching post /var/mail/didier.lock.ks12345.kimsufi.com.45654b35.00007b4e (euid=1002 egid=8) 2006-11-23 08:18:13 1Gn8qb-00013R-6I ** didier@localhost: retry timeout exceeded 2006-11-23 08:18:13 1Gn8qb-0006Pz-7o <= <> R=1Gn8qb-00013R-6I U=Debian-exim P=local S=1271 2006-11-23 08:18:13 1Gn8qb-00013R-6I Completed 2006-11-23 08:18:14 1Gn8qb-0006Pz-7o => root@abcde.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29] 2006-11-23 08:18:14 1Gn8qb-0006Pz-7o Completed
Il essaye dans un dossier totalement différent de celui que j’ai défini !
On dirait qu’il n’a pas pris en compte ma définition pour le format maildir…
Je trouve une explication pour configurer Exim4 au format maildir sur cette page
Installing and configuring Exim 4 on Debian
Il faut éditer le fichier « /etc/exim4/update-exim.conf.conf » et y ajouter la ligne :
dc_localdelivery='maildir_home'
Faire un /etc/init.d/exim4 restart
On progresse !
En effet la vérification d’adresse donne ceci :
ks36586:/etc/exim4# exim4 -bt didier@localhost R: system_aliases for didier@localhost R: userforward for didier@localhost R: procmail for didier@localhost R: maildrop for didier@localhost R: local_user for didier@localhost didier@localhost router = local_user, transport = maildir_home
Et dans le log :
2006-11-23 08:42:07 1Gn9Dj-0005ti-DW <= root@abcd.be U=root P=local S=319 2006-11-23 08:42:07 1Gn9Dj-0005ti-DW => didier R=local_user T=maildir_home 2006-11-23 08:42:07 1Gn9Dj-0005ti-DW Completed
Mon mail est OK maintenant !
J’ai bien reçu le mail dans ma boite LOCALE
didier@ks12345:~/Maildir/new$ ls -l total 4 -rw------- 1 didier didier 431 2006-11-23 08:42 1164267727.H438019P10186.ks12345.kimsufi.com
Je ne sais pas comment il compose son nom de fichier, mais en allant voir son contenu, c’est bien le mail que je me suis envoyé
Je refais un test vers « didier@libre-pc.be » …
et ça ne fonctionne toujours pas.
Donc, un problème de résolu : les mails @localhost et les boites au format maildir,
mais il reste un problème avec le dossier virtualhost qui n’est pas pris ! ![]()

Ok…
Un oeil extérieur, ça aide souvent beaucoup ![]()
Mon problème vient d’une stupide erreur de nom de dossier pour les virtual hosts!
J’ai « virtual » dans les 2 fichiers de configuration
- /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
- /etc/exim4/conf.d/router/350_exim4-config_vdom_aliases
et « virtualhosts » dans les autres fichiers et comme dossier !
)
Je corrige et mets « virtualhosts » partout, et restart de Exim4 évidemment.
Ca ne va pas encore. Il doit rester une erreur :
exim4 -bt didier@libre-pc.be R: dnslookup for didier@libre-pc.be LOG: MAIN lowest numbered MX record points to local host: libre-pc.be (while routing ) didier@libre-pc.be cannot be resolved at this time: lowest numbered MX record points to local host
2006-11-23 19:24:46 1GnJFe-0001XV-SA <= root@abcde.be U=root P=local S=329 2006-11-23 19:24:46 1GnJFe-0001XV-SA lowest numbered MX record points to local host: libre-pc.be 2006-11-23 19:24:46 1GnJFe-0001XV-SA == didier@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host 2006-11-23 19:24:46 1GnJFe-0004zm-T7 <= <> R=1GnJFe-0001XV-SA U=Debian-exim P=local S=593 2006-11-23 19:24:46 1GnJFe-0001XV-SA Frozen 2006-11-23 19:24:47 1GnJFe-0004zm-T7 => postmaster@abcde.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29] 2006-11-23 19:24:47 1GnJFe-0004zm-T7 Completed

J’ai finalement trouvé.
Tout se passe comme si Exim4 ne tenait même pas compte de ma définition indiquant un dossier /etc/exim4/virtualhosts
Pas qu’il ne le trouve pas… Il n’en tient pas compte !
Pourquoi ?
C’est un problème de configuration d’Exim4.
Il y a deux façons d’avoir les fichiers de configuration d’Exim4.
- soit regroupé en 2 ou 3 gros fichiers
- soit splitté en plusieurs petits fichiers de configuration
Cette 2ème manière est plus claire et souple, et elle correspond aux fichiers de configuration que j’ai. Mais Exim n’en tient pas compte car il n’est pas dans ce mode !
Il faut forcer ce mode « split config » :
vi /etc/exim4/update-exim.conf.conf
dc_use_split_config='true'
Redémarrage d’Exim et essais de résolution :
# exim4 -bt didier@libre-pc.be LOG: MAIN PANIC DIE failed to open /etc/exim4/virtual for directory search: No such file or directory
C’est TRES clair !
Il me reste un mauvais nom de dossier « virtual » qui traine dans un fichier de configuration.
Il est ici :
/etc/exim4/conf.d/router# vi 350_exim4-config_vdom_aliases
La ligne « domains » était fausse et contenait le dossier « /etc/exim4/virtual »
Je l’ai corrigée :
vdom_aliases:
driver = redirect
allow_defer
allow_fail
domains = dsearch;/etc/exim4/virtualhosts
data = ${expand:${lookup{$local_part}lsearch*@{/etc/exim4/virtualhosts/$domain}}}
retry_use_local_part
pipe_transport = address_pipe
file_transport = address_file
no_more
Voilà, ça fonctionne nettement mieux !
J’ai actuellement ceci dans /etc/exim4/virtualhosts/libre-pc.be
- didier : didier@localhost
- info : didier.misson@belcenter.com
- postmaster : didier.misson@belcenter.com
- webmaster : didier.misson@belcenter.com
Quelques essais de résolution :
# exim4 -bt didier@libre-pc.be R: system_aliases for didier@localhost R: userforward for didier@localhost R: procmail for didier@localhost R: maildrop for didier@localhost R: local_user for didier@localhost didier@localhost <-- didier@libre-pc.be router = local_user, transport = maildir_home # exim4 -bt info@libre-pc.be R: dnslookup for didier.misson@belcenter.com didier.misson@belcenter.com <-- info@libre-pc.be router = dnslookup, transport = remote_smtp host MX01.AS31449.net [217.112.180.111] MX=10 host MX02.AS31449.net [217.112.181.155] MX=1000
Cela fonctionne correctement :
- le mail didier@libre-pc.be arrive bien en local sur le serveur dans /home/blog/Maildir/new
- le mail info@libre-pc.be est bien routé vers didier.misson@belcenter.com
![]()
Il reste un petit problème: A la réception dans ma boite Belcenter, Thunderbird classe directement le mail reçu dans les SPAM ![]()
Je pense que c’est une question d’adresse d’origine du mail, mais je verrai cela plus tard

Exim4 en réception ?
Cela fonctionne. Si je fais « Répondre » dans Thunderbird, la réponse arrive bien au serveur. Elle est bien traitée par Exim4 qui place le mail en local dans /home/blog/Maildir/new
Mon mail venant de ma boite « belcenter.com » a bien été envoyé depuis le serveur SMTP de Mobistar.
2006-11-24 04:03:24 1GnRLY-00012N-Tw <= didier.misson@belcenter.com H=smtp40.mobistarmail.be [193.252.23.61] P=esmtp S=1639 id=456660D2.1010605@belcenter.com 2006-11-24 04:03:24 1GnRLY-00012N-Tw => didier R=local_user T=maildir_home 2006-11-24 04:03:24 1GnRLY-00012N-Tw Completed
Et la sécurité ?
Je n’ai pas envie de servir de relais de spams !
Elle semble assurée, ok !
Si j’envoie vers le serveur Exim4 un mail, via le relais SMTP de mon provider Internet, vers une adresse dont le domaine n’est pas configuré dans les virtual hosts d’Exim, Exim4 rejette le mail et renvoie un message d’erreur vers l’expéditeur.
Dans le log :
2006-11-24 04:17:59 H=smtp40.mobistarmail.be [193.252.23.61] F= rejected RCPT <
didier@libre-pc.com>: relay not permitted
J’ai en effet le fichier /etc/exim4/virtualhosts/libre-pc.be , mais PAS celui de libre-pc.com.
Le MX record de « libre-pc.com » pointe bien vers le serveur Exim, mais Exim4 rejette les mails de ce domaine car il ne fait pas partie des virtual hosts définis.
Exim4 n’accepte donc en entrée QUE les mails vers SES propres domaines.

Ce billet est devenu plus une liste des recherches d’erreurs que j’avais faite, qu’une recette d’installation et configuration
Je vais refaire dés que j’aurai le temps, un nouveau billet propre et plus court, en ne reprendant QUE ce qui est correct, sans le debugging
Si vous lisez ce billet avant que j’en ai fait la synthèse, j’espère que cela vous guidera malgré tout.













18 novembre 2006
Très bon. Merci