{"id":37,"date":"2006-10-22T19:14:44","date_gmt":"2006-10-22T18:14:44","guid":{"rendered":"http:\/\/almin.tf\/blog\/?p=37"},"modified":"2026-01-24T01:17:24","modified_gmt":"2026-01-24T00:17:24","slug":"gerer-mail-avec-unix","status":"publish","type":"post","link":"https:\/\/almic.fr\/blog\/2006\/10\/22\/gerer-mail-avec-unix\/","title":{"rendered":"G\u00e9rer le mail avec Unix"},"content":{"rendered":"<p style=\"text-align: justify;\">Avec postfix, dovecot et fetchmail, on peut g\u00e9rer le mail pour un ou plusieurs noms de domaine, cr\u00e9er des alias, utiliser des tags (utilisateur+tag@domaine.tld), regrouper les mails venant de plusieurs h\u00e9bergeurs sur un seul compte\u2026 entre autres.<\/p>\n<p style=\"text-align: justify;\">Ce tutoriel a \u00e9t\u00e9 tenu \u00e0 jour jusqu\u2019au <b>29 ao\u00fbt 2014<\/b>.<\/p>\n<p><!--more--><\/p>\n<p style=\"text-align: justify;\">Les commandes pr\u00e9fix\u00e9es d\u2019un # sont \u00e0 lancer en root. Les commandes pr\u00e9fix\u00e9es d\u2019un % sont \u00e0 lancer en simple utilisateur.<\/p>\n<h2>Mise en place de Postfix<\/h2>\n<h4>Installation<\/h4>\n<p style=\"text-align: justify;\">Par d\u00e9faut sur une machine Debian on trouve Exim, qu&rsquo;il va supprimer si on veut installer un autre MTA. Je vous sugg\u00e8re de purger le paquet, puisque vous n\u2019en aurez plus besoin.<\/p>\n<p><code># apt-get purge exim<br \/>\n# apt-get install postfix procmail<\/code><\/p>\n<h4>Configuration de base<\/h4>\n<p style=\"text-align: justify;\">Un serveur de mail est utile sur une machine Linux m\u00eame si celle-\u00e7i n&rsquo;a pas une vocation de serveur mail, ou m\u00eame si elle n&rsquo;est pas connect\u00e9e \u00e0 Internet. En effet, des outils syst\u00e8mes comme cron, at ou encore des outils de s\u00e9curit\u00e9 comme tiger ou snort sont configur\u00e9s, ou peuvent \u00eatre configur\u00e9s, pour envoyer des mails \u00e0 l&rsquo;administrateur syst\u00e8me afin de l&rsquo;informer du r\u00e9sultat de leur ex\u00e9cution. Pour une utilisation locale, vous n\u2019aurez pas besoin des sections \u00ab Gestion du mail pour un nom de domaine \u00bb et \u00ab \u00c9viter le spam \u00bb.<\/p>\n<p style=\"text-align: justify;\">Vous pouvez vous baser sur le fichier de configuration g\u00e9n\u00e9r\u00e9 par debconf selon les r\u00e9ponses que vous avez faites lors de l&rsquo;installation. Si Postfix \u00e9tait d\u00e9j\u00e0 install\u00e9 lorsque vous vous \u00eates lanc\u00e9 dans sa configuration, vous pouvez le reconfigurer.<\/p>\n<p><code># dpkg-reconfigure postfix<\/code><\/p>\n<p style=\"text-align: justify;\">Si vous voulez le configurer enti\u00e8rement \u00e0 la main, vous pouvez commencer par copier le fichier de configuration type fourni par le mainteneur du paquet, pour l&rsquo;adapter \u00e0 vos besoins :<\/p>\n<p><code># cd \/etc\/postfix\/<br \/>\n# mv main.cf main.cf.original_debian<br \/>\n# cp \/usr\/share\/postfix\/main.cf.dist main.cf<\/code><\/p>\n<p style=\"text-align: justify;\">On va ensuite \u00e9diter ce fichier <i>\/etc\/postfix\/main.cf<\/i> sur lequel repose la majeure partie de la configuration de Postfix. Les param\u00e8tres y ressemblent \u00e0 des variables shell, avec une notation $variable.<\/p>\n<p style=\"text-align: justify;\">On sp\u00e9cifie le nom de la machine. J\u2019ai mis un basique \u00ab mx \u00bb pour \u00e9viter de donner des informations sur la topologie de mon r\u00e9seau local.<\/p>\n<p><code>myhostname = mx<\/code><\/p>\n<p style=\"text-align: justify;\">Postfix signale les probl\u00e8mes \u00e0 l&rsquo;alias postmaster. Vous pouvez ne pas \u00eatre int\u00e9ress\u00e9 par tous les types d&rsquo;\u00e9v\u00e9nements, aussi ceci est configurable. La valeur par d\u00e9faut signale seulement les probl\u00e8mes s\u00e9rieux (ressource et logiciel) au postmaster, mais il est possible d&rsquo;obtenir plus de d\u00e9tails.<\/p>\n<p><code>notify_classes = resource, software<br \/>\nnotify_classes = resource,software,bounce,delay,policy<\/code><\/p>\n<p style=\"text-align: justify;\">On peut indiquer un programme externe pour d\u00e9livrer les messages vers les bo\u00eetes mail des utilisateurs. Les utilisateurs qui souhaitent b\u00e9n\u00e9ficier des possibilit\u00e9s offertes par procmail le feront via leur <i>~\/.procmailrc<\/i> (par exemple, filtrer les mails pour \u00e9viter les spams). Les utilisateurs qui ne mettront pas de <i>~\/.procmailrc<\/i> auront leurs mails d\u00e9livr\u00e9s directement.<\/p>\n<p><code>mailbox_command = \/usr\/bin\/procmail -a \"$EXTENSION\"<\/code><\/p>\n<p style=\"text-align: justify;\">On renseigne quelques param\u00e8tres et on commente ce qui n\u2019est pas essentiel :<\/p>\n<p><code>sendmail_path = \/usr\/sbin\/sendmail<br \/>\nnewaliases_path = \/usr\/bin\/newaliases<br \/>\nmailq_path = \/usr\/bin\/mailq<br \/>\nsetgid_group = postdrop<br \/>\n#html_directory =<br \/>\n#manpage_directory =<br \/>\n#sample_directory =<br \/>\nreadme_directory = no<\/code><\/p>\n<p style=\"text-align: justify;\">Quand quelqu\u2019un se trompe d\u2019adresse, autant le lui signaler directement plut\u00f4t que de lui faire perdre du temps (et consommer inutilement des ressources).<\/p>\n<p><code>soft_bounce = no<\/code><\/p>\n<p style=\"text-align: justify;\">Le param\u00e8tre biff sp\u00e9cifie si le syst\u00e8me doit notifier ou non les utilisateurs en cas de nouveau mail (\u00ab You have new mail \u00bb dans votre terminal).<\/p>\n<p><code>biff = no<\/code><\/p>\n<p style=\"text-align: justify;\">On sp\u00e9cifie le protocole par defaut utlis\u00e9 pour d\u00e9livrer les messages.<\/p>\n<p><code>default_transport = smtp<\/code><\/p>\n<p style=\"text-align: justify;\">Pour \u00e9viter de diffuser le programme utilis\u00e9, sa version ou la distribution.<\/p>\n<p><code>smtpd_banner = ESMTP mail server<\/code><\/p>\n<p>La limite en nombre de processus.<\/p>\n<p><code>default_process_limit = 10<\/code><\/p>\n<p>Le nombre de messages d\u00e9livr\u00e9s simultanement en local.<\/p>\n<p><code>local_destination_concurrency_limit = 2<\/code><\/p>\n<p>Le nombre de messages d\u00e9livr\u00e9s simultanement aux autres.<\/p>\n<p><code>default_destination_concurrency_limit = 10<\/code><\/p>\n<p>La taille maximal d&rsquo;une mailbox (0 = pas de limite).<\/p>\n<p><code>mailbox_size_limit = 0<\/code><\/p>\n<p style=\"text-align: justify;\">La taille minimum d&rsquo;espace sur le disque pour accepter les messages (ici 30 Mo).<\/p>\n<p><code>queue_minfree = 31457280<\/code><\/p>\n<p>La taille maximum des messages accept\u00e9s (ici 20 Mo).<\/p>\n<p><code>message_size_limit = 20971520<\/code><\/p>\n<h4>Alias<\/h4>\n<p style=\"text-align: justify;\">On va utiliser le fichier <i>\/etc\/aliases<\/i> pour rediriger le mail de certains utilisateurs vers d&rsquo;autres :<\/p>\n<p><code>alias_maps = hash:\/etc\/aliases<br \/>\nalias_database = hash:\/etc\/aliases<\/code><\/p>\n<p style=\"text-align: justify;\">Il est souhaitable de param\u00e9trer au minimum un alias pour postmaster pointant vers le nom d&rsquo;un utilisateur. Cet alias doit exister pour que les gens puissent vous signaler des probl\u00e8mes de distribution de courrier. V\u00e9rifiez que vous redirigez \u00e9galement le courrier du super-utilisateur. Voil\u00e0 la syntaxe de ce fichier :<\/p>\n<p><code># utilisateur_origine: utilisateur_destination<br \/>\nmailer-daemon: utilisateur_destination<br \/>\npostmaster: utilisateur_destination<br \/>\nroot: utilisateur_destination<\/code><\/p>\n<p style=\"text-align: justify;\">Apr\u00e8s toute modification de <i>\/etc\/aliases<\/i>, lancez la commande suivante :<\/p>\n<p><code># newaliases<\/code><\/p>\n<h4> Gestion du mail pour un nom de domaine<\/h4>\n<p style=\"text-align: justify;\">Pour g\u00e9rer le mail d&rsquo;un nom de domaine, il faut que la machine soit d\u00e9sign\u00e9e MX par le serveur DNS : voir \u00e0 ce sujet le <a class=\"billet\" href=\"\/blog\/\">billet sur BIND<\/a>. Il faudra aussi penser \u00e0 configurer votre firewall pour qu&rsquo;il laisse tout le monde acc\u00e9der au port 25.<\/p>\n<p style=\"text-align: justify;\">Le param\u00e8tre $mydomain indique le nom de domaine pour lequel notre serveur g\u00e8re le mail.<\/p>\n<p><code>mydomain = almic.tf<\/code><\/p>\n<p style=\"text-align: justify;\">Le param\u00e8tre $myorigin indique le domaine qui appara\u00eet dans le courrier envoy\u00e9 \u00e0 partir de cette machine.<\/p>\n<p><code>myorigin = $myhostname<\/code><\/p>\n<p style=\"text-align: justify;\">Le param\u00e8tre $mydestination indique les domaines pour lesquels cette machine re\u00e7oit les mails (au lieu de le relayer). Si plusieurs domaines sont indiqu\u00e9s, les mails envoy\u00e9s \u00e0 utilisateur@domain2.tld et utilisateur@domain3.tld seront destin\u00e9s \u00e0 la m\u00eame bo\u00eete aux lettres.<\/p>\n<p><code>mydestination = localhost, server_hostname, $myhostname, $mydomain, domain2.tld, domain3.tld<\/code><\/p>\n<p style=\"text-align: justify;\">Postfix relaie le courrier des clients des r\u00e9seaux et des domaines autoris\u00e9s, d\u00e9finis par le param\u00e8tre $mynetworks.<\/p>\n<p><code>mynetworks = 127.0.0.0\/8, 192.168.0.0\/16, [::ffff:127.0.0.0]\/104, [::1]\/128<\/code><\/p>\n<p style=\"text-align: justify;\">Postfix relaie le courrier \u00e9tranger, c\u2019est-\u00e0-dire le courrier qui n\u2019est pas directement adress\u00e9 \u00e0 un domaine contenu dans $mydestination. Les domaines d\u2019origine autoris\u00e9s sont d\u00e9finis gr\u00e2ce \u00e0 $relay_domains. C&rsquo;est le point sensible qui peut transformer un serveur mail en relai pour les spams.<\/p>\n<p><code>relay_domains = $mynetworks<\/code><\/p>\n<p style=\"text-align: justify;\">Par d\u00e9faut, Postfix d\u00e9livre le courrier directement sur Internet. Suivant votre environnement, ce n&rsquo;est pas toujours souhaitable. Par exemple, certains fournisseurs d&rsquo;acc\u00e8s (comme AOL) posent des probl\u00e8mes pour envoyer du courrier vers leurs abonn\u00e9s \u00e0 partir de serveurs personnels. Il est possible d\u2019indiquer \u00e0 Postfix de passer par un relai, en g\u00e9n\u00e9ral le serveur SMTP de votre fournisseur d&rsquo;acc\u00e8s. L&rsquo;utilisation des \u00ab [] \u00bb \u00e9vite la consultation des champs MX du DNS.<\/p>\n<p><code>relayhost = [smtp.free.fr]<\/code><\/p>\n<p style=\"text-align: justify;\">On va nettoyer certaines en-t\u00eates pour \u00e9viter de donner des infos inutiles sur la configuration de notre r\u00e9seau. De plus, la multiplication des transferts augmente la probabilit\u00e9 qu\u2019un mail soit per\u00e7u comme du spam. Autant ne faire appara\u00eetre qu\u2019un seul transfert, entre notre postfix et celui du FAI. Dans <i>\/etc\/postfix\/main.cf<\/i> :<\/p>\n<p><code>header_checks = regexp:\/etc\/postfix\/header_checks<\/code><\/p>\n<p>Dans <i>\/etc\/postfix\/header_checks<\/i> :<\/p>\n<p><code>\/^Received: from client_hostname.local_network\/ IGNORE<\/code><\/p>\n<h4>G\u00e9rer des domaines suppl\u00e9mentaires au moyen d\u2019alias<\/h4>\n<p style=\"text-align: justify;\">En plus des domaines list\u00e9s dans $mydestination, postfix peut accepter les mails pour d\u2019autres domaines. Chaque adresse d\u2019un domaine h\u00e9berg\u00e9 de cette mani\u00e8re est un alias d&rsquo;un compte unix ou d&rsquo;une adresse ext\u00e9rieure.<\/p>\n<p><code>virtual_alias_domains = autredomaine.fr<br \/>\nvirtual_alias_maps = hash:\/etc\/postfix\/virtual<\/code><\/p>\n<p>On cr\u00e9e le fichier <i>\/etc\/postfix\/virtual<\/i>.<\/p>\n<pre>### Domaine virtuel autredomaine.fr\n\nusername@autredomaine.fr       almic\n\nabuse@autredomaine.fr          root\nwebmaster@autredomaine.fr      root\npostmaster@autredomaine.fr     root\nhostmaster@autredomaine.fr     root\noperator@autredomaine.fr       root\nadmin@autredomaine.fr          root\nsecurity@autredomaine.fr       root\nspam@autredomaine.fr           root\nroot@autredomaine.fr           almic\nwww-data@autredomaine.fr       almic\nmailer-daemon@autredomaine.fr  almic\n\nbidule@autredomaine.fr         bidule@machin.com\n\n# D\u00e9commentez l'entr\u00e9e suivante pour impl\u00e9menter une adresse de collecte.\n# Ce n'est pas sans risque. Les spammers essaient d'envoyer du courrier\n# semblant venir et \u00e0 destination de n'importe quel nom possible. Une \n# adresse de collecte est susceptible de recevoir de nombreux messages de\n# spam ou de notification de messages envoy\u00e9s avec une adresse        \n# n-importe-quoi@exemple.com. \n#@autredomaine.fr              almic<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s toute modification du fichier <i>\/etc\/postfix\/virtual<\/i>, il faut lancer cette commande :<\/p>\n<p><code>postmap \/etc\/postfix\/virtual<\/code><\/p>\n<p style=\"text-align: justify;\">Une fois que tout est en place :<\/p>\n<p><code># service postfix reload<\/code><\/p>\n<h4>Premiers contr\u00f4les contre le spam<\/h4>\n<p style=\"text-align: justify;\">On veut accepter le courrier ext\u00e9rieur \u00e0 destination de \u00ab utilisateur@exemple.fr \u00bb, mais pas \u00e0 destination de \u00ab utilisateur@machin.exemple.fr \u00bb :<\/p>\n<p><code>parent_domain_matches_subdomains = debug_peer_list smtpd_access_maps<\/code><\/p>\n<p style=\"text-align: justify;\">On d\u00e9sactive certaines techniques utilis\u00e9es pour obtenir des adresses mail valides sur le serveur :<\/p>\n<p><code>disable_vrfy_command = yes<\/code><\/p>\n<p style=\"text-align: justify;\">Les spammeurs ne respectent rien, pas m\u00eame les RFC. Du coup, on peut commencer \u00e0 les filtrer en rejettant les comportements non conforme \u00e0 la norme. Par exemple, on fixera une pause d&rsquo;une seconde en d\u00e9but de connection : si le serveur en face ne la respecte pas, \u00e7a signifie qu&rsquo;il a \u00e9t\u00e9 \u00e9crit pour utiliser abusivement la canalisation des commandes SMTP, afin d&rsquo;acc\u00e9l\u00e9rer ses livraisons. On rejettera aussi les mails provenant de serveurs tournant sur une IP sans DNS associ\u00e9.<\/p>\n<pre>smtpd_helo_required = yes\nstrict_rfc821_envelopes = yes\nsmtpd_client_restrictions =\n    permit_mynetworks,\n    # \u00c0 d\u00e9commenter pour SASL\n    #permit_sasl_authenticated,\n    reject_invalid_hostname,\n    reject_unknown_sender_domain,\n    reject_unknown_recipient_domain,\n    reject_non_fqdn_recipient,\n    reject_unauth_pipelining,\n    reject_unauth_destination,\n    permit<\/pre>\n<p style=\"text-align: justify;\">La ligne \u00ab permit_sasl_authenticated \u00bb ne doit \u00eatre ajout\u00e9e que si vous comptez envoyer des mails \u00e0 partir de n&rsquo;importe quelle IP, apr\u00e8s vous \u00eatre identifi\u00e9. Voyons \u00e7a plus en d\u00e9tail.<\/p>\n<h4>Utiliser son serveur SMTP pour l&rsquo;envoi des mails, o\u00f9 que l&rsquo;on soit<\/h4>\n<p style=\"text-align: justify;\">Pour ne pas avoir \u00e0 changer la configuration du client mail quand on n\u2019est pas sur le r\u00e9seau local, on peut utiliser SASL. Dans <i>\/etc\/postfix\/main<\/i> on d\u00e9commente la ligne <i>smtpd_sasl_auth_enable = yes<\/i>, et on ajoute :<\/p>\n<p><code># TLS<br \/>\nsmtpd_use_tls=yes<br \/>\nsmtpd_tls_cert_file=\/etc\/ssl\/certs\/ssl-cert-snakeoil.pem<br \/>\nsmtpd_tls_key_file=\/etc\/ssl\/private\/ssl-cert-snakeoil.key<br \/>\nsmtpd_tls_session_cache_database = btree:${data_directory}\/smtpd_scache<br \/>\nsmtp_tls_session_cache_database = btree:${data_directory}\/smtp_scache<\/code><\/p>\n<p>Ensuite on installe SASL.<br \/>\n<code># apt-get install sasl2-bin libsasl2-modules<\/code><\/p>\n<p>On ajoute l&rsquo;utilisateur postfix au groupe sasl.<br \/>\n<code># adduser postfix sasl<\/code><\/p>\n<p>On \u00e9dite <i>\/etc\/default\/saslauthd<\/i>.<br \/>\n<code>START=yes<br \/>\nMECHANISMS=\"rimap\"<br \/>\nMECH_OPTIONS=\"localhost\"<br \/>\nTHREADS=0<br \/>\nOPTIONS=\"-r -c -m \/var\/spool\/postfix\/var\/run\/saslauthd\"<\/code><\/p>\n<p style=\"text-align: justify;\">Si vous avez sorti postfix de son chroot, il faut mettre \/var\/run\/saslauthd.<\/p>\n<p>On cr\u00e9e le r\u00e9pertoire :<br \/>\n<code>mkdir -p \/var\/spool\/postfix\/var\/run\/saslauthd<\/code><\/p>\n<p>On cr\u00e9e <i>\/etc\/postfix\/sasl\/smtpd.conf<\/i>.<br \/>\n<code>pwcheck_method: saslauthd<br \/>\nmech_list: plain login<\/code><\/p>\n<p style=\"text-align: justify;\">Une fois Courier configur\u00e9 (voir plus bas), vous pourrez tester la configuration de sasl avec cette commande :<\/p>\n<p><code># testsaslauthd -f \/var\/spool\/postfix\/var\/run\/saslauthd\/mux -u USER -p PASS<\/code><\/p>\n<h4>V\u00e9rifications et tests<\/h4>\n<p>Tant que la sortie de :<\/p>\n<p><code># service postfix check<\/code><\/p>\n<p style=\"text-align: justify;\">vous renvoie quelque chose, jetez-y un coup d&rsquo;\u0153il. Ensuite, relancez Postfix :<\/p>\n<p><code># service postfix restart<\/code><\/p>\n<p style=\"text-align: justify;\">Pendant les tests, il est souhaitable d&rsquo;activer le maximum de choses dans $notify_classes. Tant que vous avez quelque chose de ce genre dans <i>\/var\/log\/mail.*<\/i>, votre serveur mail n&rsquo;est pas en \u00e9tat de marche :<\/p>\n<p><code>Oct  9 13:16:32 hostname postfix\/master[8717]: warning: process \/usr\/lib\/postfix \/smtpd pid 8880 exit status 1<br \/>\nOct  9 13:16:32 hostname postfix\/master[8717]: warning: \/usr\/lib\/postfix\/smtpd: bad command startup -- throttling<\/code><\/p>\n<p style=\"text-align: justify;\">Une fois que Postfix s&rsquo;est lanc\u00e9 correctement, vous pouvez essayer de vous envoyer un mail en local, puis vers un autre nom de domaine, puis \u00e0 partir d&rsquo;un autre nom de domaine vers votre serveur mail.<\/p>\n<h2>Regrouper les mails de plusieurs h\u00e9bergeurs<\/h2>\n<p style=\"text-align: justify;\">Fetchmail permet d\u2019aller chercher les mails de plusieurs adresses diff\u00e9rentes, venant de plusieurs h\u00e9bergeurs diff\u00e9rents, et de tout centraliser vers une seule adresse.<\/p>\n<p>On commence par installer les outils n\u00e9cessaires :<br \/>\n<code># apt-get install fetchmail cron anacron logrotate<\/code><\/p>\n<p>Ensuite on \u00e9dite le fichier <i>~\/.fetchmailrc<\/i>.<\/p>\n<p><code>poll pop.FAI1.fr protocol POP3<br \/>\nusername USER<br \/>\npassword PASS<\/p>\n<p>poll pop.FAI2.com protocol POP3<br \/>\nusername USER<br \/>\npassword PASS<\/p>\n<p>poll pop.MAIL3.org protocol POP3 port 995<br \/>\nusername USER<br \/>\npassword PASS<br \/>\nssl<\/code><\/p>\n<p style=\"text-align: justify;\">Pour prot\u00e9ger vos mots de passe, il faut chmod ce fichier.<\/p>\n<p><code>% chmod 600 ~\/.fetchmailrc<\/code><\/p>\n<p style=\"text-align: justify;\">Sinon fetchmail refusera de se lancer. Par ailleurs, v\u00e9rifiez que le nom d&rsquo;h\u00f4te de votre machine est renseign\u00e9 dans <i>\/etc\/hosts<\/i>.<\/p>\n<p>Lancez ensuite en simple utilisateur :<\/p>\n<p><code>% crontab -e<\/code><\/p>\n<p>pour rajouter ces lignes :<\/p>\n<p><code>*\/5 * * * * fetchmail -t 120 -m procmail >> ~\/.log-fetchmail 2>> ~\/.log-fetchmail<br \/>\n*\/15 * * * * sh ~\/scripts\/faux_posneg >\/dev\/null 2>\/dev\/null<br \/>\n5 0 * * * \/usr\/sbin\/logrotate -s ~\/.logrotate.status ~\/.logrotate.conf<\/code><\/p>\n<p style=\"text-align: justify;\">Cron envoie par mail toute sortie, standart ou sterr. Si vous voulez compl\u00e9tement \u00e9viter les mails, rajoutez cette ligne au d\u00e9but de votre crontab.<\/p>\n<p><code>MAILTO = \"\"<\/code><\/p>\n<h4>Nettoyage des logs<\/h4>\n<p style=\"text-align: justify;\">Bien qu&rsquo;utiles, les logs finissent par devenir encombrants. Afin de limiter l&rsquo;espace disque occup\u00e9, on va limiter la taille des fichiers de log que nous avons cr\u00e9\u00e9s. Comme vous avez pu l\u2019apercevoir dans la crontab, on fait appel \u00e0 logrotate pour r\u00e9gler ce probl\u00e8me. Il se configure en cr\u00e9ant un fichier de param\u00e8tres, qui indique la taille maximale et les niveaux de sauvegardes. D\u00e8s que le log d\u00e9passe la limite fix\u00e9e, logrotate le d\u00e9place en sauvegarde, d\u00e9cale d&rsquo;un cran les autres sauvegardes et supprime la derni\u00e8re.<\/p>\n<p>Cr\u00e9ez <i>~\/.logrotate.conf<\/i>.<\/p>\n<pre>\/home\/almic\/.log-fetchmail {\n    rotate 2\n    size=50k\n}\n\n\/home\/almic\/.log-procmail {\n    rotate 2\n    size=100k\n}<\/pre>\n<h2>Installer un serveur POP\/IMAP<\/h2>\n<p style=\"text-align: justify;\">Je suis pass\u00e9 \u00e0 dovecot, apr\u00e8s avoir eu trop d\u2019ennuis avec courier. On l\u2019installe avec cette commande :<\/p>\n<p><code>apt-get install dovecot-pop3d dovecot-imapd<\/code><\/p>\n<p>Fichier <i>\/etc\/dovecot\/conf.d\/10-ssl.conf<\/i>.<\/p>\n<p><code>ssl = required<\/code><\/p>\n<p>Fichier <i>\/etc\/dovecot\/conf.d\/10-mail.conf<\/i>.<\/p>\n<p><code>mail_location = maildir:~\/mail<\/code><\/p>\n<p>Fichier <i>\/etc\/dovecot\/conf.d\/10-logging.conf<\/i>.<\/p>\n<p><code>log_path = \/var\/log\/dovecot.log<\/code><\/p>\n<p style=\"text-align: justify;\">Si vous voulez acc\u00e9der \u00e0 dovecot en dehors du r\u00e9seau local, ouvrez ou fa\u00eetes suivre les ports 110 et 143.<\/p>\n<h2>Lutter contre le spam<\/h2>\n<h4>SpamAssassin et Bogofilter<\/h4>\n<p style=\"text-align: justify;\">On va indiquer \u00e0 procmail de filtrer les mails avec SpamAssassin et Bogofilter. Ils ajouteront des en-t\u00eates au mail qui permettront au logiciel de mail utilis\u00e9 de les trier par dossier. On utilisera aussi formail pour reformater correctement les mails. On commence par installer :<\/p>\n<p><code># apt-get install bogofilter spamassassin razor<\/code><\/p>\n<p style=\"text-align: justify;\">\u00c9ditez ensuite <i>\/etc\/default\/spamassassin<\/i> pour positionner \u00ab ENABLED \u00bb sur 1. Puis rendez-vous sur <a class=\"billet\" href=\"http:\/\/www.yrex.com\/spam\/spamconfig.php\">ce g\u00e9n\u00e9rateur<\/a> afin de cr\u00e9er un fichier de configuration pour SpamAssassin. Vous placerez le r\u00e9sultat dans <i>~\/.spamassassin\/user_prefs<\/i>, chez moi \u00e7a a donn\u00e9 \u00e7a :<\/p>\n<pre># SpamAssassin config file for version 3.x\n# Generated by http:\/\/www.yrex.com\/spam\/spamconfig.php (version 1.50)\n\n# How many hits before a message is considered spam.\nrequired_score          5.0\n\n# Encapsulate spam in an attachment (0=no, 1=yes, 2=safe)\nreport_safe             0\n\n# Enable the Bayes system\nuse_bayes               1\n\n# Enable Bayes auto-learning\nbayes_auto_learn        1\n\n# Score minimal pour apprendre que le message est un spam : 10\n# Score maximal pour apprendre que le message n'est pas un spam : -5.0\n\n# Enable or disable network checks\nskip_rbl_checks         0\nuse_razor2              1\nuse_pyzor               0\n\n# Mail using locales used in these country codes will not be marked\n# as being possibly spam in a foreign language.\nok_locales              en\n\n# exemple de score pour une r\u00e8gle\n#score SUBJECT_DRUG_GAP_C 3.0<\/pre>\n<p>Dans <i>~\/.spamassassin\/razor-agent.conf<\/i> mettez<\/p>\n<p><code>razorhome = ~\/.razor<\/code><\/p>\n<p>Une fois que la configuration est termin\u00e9e :<\/p>\n<p><code>service spamassassin start<\/code><\/p>\n<p style=\"text-align: justify;\">Pour tester que votre configuration de SpamAssassin est bonne, la sortie de la commande suivante doit \u00eatre nulle :<\/p>\n<p><code>% spamassassin --lint<\/code><\/p>\n<h4>Apprentissage<\/h4>\n<p style=\"text-align: justify;\">Afin d&rsquo;augmenter la pertinence de SpamAssassin et de Bogofilter, il faut leur donner \u00e0 manger \u00e0 la fois des spams et du courrier l\u00e9gitime. Commencez par les regrouper dans deux fichiers.<\/p>\n<p>Pour SpamAssassin.<\/p>\n<p><code>% sa-learn --spam --mbox spam<br \/>\n% sa-learn --ham --mbox ham<\/code><\/p>\n<p>Pour Bogofilter.<\/p>\n<p><code>% bogofilter -MBvts spam<br \/>\n% bogofilter -MBvtn ham<\/code><\/p>\n<p style=\"text-align: justify;\">Pour g\u00e9rer les faux positifs et n\u00e9gatifs, on cr\u00e9e ce script <i>~\/scripts\/faux_posneg.sh<\/i> :<\/p>\n<pre>#!\/bin\/sh\n\ncd ~\/Maildir\/.Faux_positifs\/cur\/\nfor i in `ls`\ndo\n  bogofilter -Bvtn $i\n  sa-learn --ham $i\n  mv $i ~\/Maildir\/cur\/\ndone\n \ncd ~\/Maildir\/.Faux_negatifs\/cur\/\nfor i in `ls`\ndo\n  bogofilter -Bvts $i\n  sa-learn --spam $i\n  mv $i ~\/Maildir\/.Spams\/cur\/\ndone<\/pre>\n<p style=\"text-align: justify;\">Ainsi si un mail licite est class\u00e9 comme spam, il vous suffira de le mettre dans le r\u00e9pertoire <i>Faux_positifs<\/i> (via IMAP) et ce script se chargera d&rsquo;apprendre \u00e0 SpamAssassin et\/ou Bogofilter qu&rsquo;ils se sont tromp\u00e9s, puis il le placera dans la bo\u00eete de r\u00e9ception. Les faux n\u00e9gatifs iront dans le dossier de m\u00eame nom.<\/p>\n<h4>Procmail<\/h4>\n<p>On \u00e9dite <i>~\/.procmailrc<\/i>.<\/p>\n<pre>SHELL=\/bin\/sh\nMAILDIR=$HOME\/Maildir\nLOGFILE=$HOME\/.log-procmail\nVERBOSE=yes\n\n# On reformate les mails correctement, notamment le champ from initial\n#\n:0f\n| formail\n\n# On soumet \u00e0 l'analyse de spamassassin, en prenant soin\n# de nettoyer les spams analys\u00e9s des pr\u00e9c\u00e9dentes traces d'analyse.\n# On ne traite que les messages inf\u00e9rieurs \u00e0 250 kB car la majeure\n# partie des spams ne sont pas plus volumineux et travailler sur de\n# gros messages peut rendre spamassassin gourmand en ressources.\n#\n:0fw\n* < 256000\n| spamassassin -d | spamassassin\n\n# Si spamassassin se plante en cours de route, le mail\n# qu'il traitait ne sera pas perdu. Il arrivera dans DEFAULT.\n#\n:0e\n{\n    exitcode=$?\n}\n\n# On passe par bogofilter\n# -p)assthrough -u)pdate, -l)og -e)xitcode 0 for spam and ham\n# -v)erbose\n#\n:0fw\n| bogofilter -p -u -l -e -v\n\n# On r\u00e9cup\u00e8re aussi les erreurs de Bogofilter.\n# Better put this after _EACH_ delivering recipe (not shown here).\n# Later, the MTA will try again to deliver it.\n# 75 is the value for EX_TEMPFAIL in \/usr\/include\/sysexits.h\n#\n:0e\n{\n    EXITCODE=75\n    HOST\n}\n\n# Work around procmail bug: any output on stderr will cause the \"F\" in \"From\"\n# to be dropped. This will re-add it.\n:0\n* ^^rom[ ]\n{\n  LOG=\"*** Dropped F off From_ header! Fixing up. \"\n\n  :0 fhw\n  | sed -e '1s\/^\/F\/'\n}\n# Le courrier marqu\u00e9 comme spam par SpamAssassin\n#\n:0:\n* ^X-Spam-Level: \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\n.Spams\/\n\n# Le courrier marqu\u00e9 comme spam par Bogofilter\n#\n:0:\n* ^X-Bogosity: (Spam|Yes)\n.Spams\/\n\n# put copy error catcher here to avoid fallthrough\n\n# Le courrier marqu\u00e9 comme spam possible par SpamAssassin\n#\n:0:\n* ^X-Spam-Status: Yes\n.Suspects\/\n\n# Le courrier marqu\u00e9 comme spam possible par Bogofilter\n#\n:0:\n* ^X-Bogosity: Unsure\n.Suspects\/\n\n# Le reste du courrier est consid\u00e9r\u00e9 comme licite\n#\n:0:\n$MAILDIR\/<\/pre>\n<p style=\"text-align: justify;\">Vous devriez maintenant trouver de nouveaux en-t\u00eates relatifs au spam dans vos mails.<\/p>\n<h2>Installer un webmail<\/h2>\n<p style=\"text-align: justify;\">Un webmail est un client IMAP accessible par le web. J'ai choisi IMP, bas\u00e9 sur le framework Horde, qui permettra d'utiliser \u00e9galement le carnet d'adresse Turba et le gestionnaire de signets Trean.<\/p>\n<h4>Apache et php<\/h4>\n<p style=\"text-align: justify;\">Cette partie suppose que vous avez un apache fonctionnel. Malheureusement, on ne peut avoir qu'un seul h\u00f4te https par IP, mais cela est en train de changer avec des choses comme SNI.<\/p>\n<p>On active le mod_ssl d'apache :<\/p>\n<p><code># a2enmod ssl<\/code><\/p>\n<p style=\"text-align: justify;\">Ensuite on cr\u00e9e le fichier <i>\/etc\/apache2\/sites-enabled\/horde.domain.tld<\/i>.<\/p>\n<pre>< VirtualHost *:443 >\n  ServerName horde.domain.tld\n  ServerAdmin postmaster@domain.tld\n  ServerSignature Off\n  SSLEngine on\n  SSLCertificateFile \/etc\/ssl\/private\/horde.pem\n  DocumentRoot \/srv\/www\/horde\/\n  < Directory \/>\n    Options SymLinksIfOwnerMatch MultiViews\n    AllowOverride None\n  < \/Directory >\n  ErrorLog \/var\/log\/apache2\/horde-error.log\n  LogLevel warn\n  CustomLog \/var\/log\/apache2\/horde-access.log combined\n< \/VirtualHost ><\/pre>\n<p>On cr\u00e9e notre certificat.<\/p>\n<p><code># openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout \/etc\/ssl\/private\/horde.pem -out \/etc\/ssl\/private\/horde.pem<\/code><\/p>\n<p>On relance apache :<\/p>\n<p><code># service apache2 restart<\/code><\/p>\n<p>Ensuite on s\u2019assure que l\u2019installation de PHP est suffisante.<\/p>\n<p><code># apt-get install php5-gd php5-imap php5-ldap php5-mysql php-pear php-log php-db php-net-socket php-mail php-mail-mime php-http-request php5-memcache<\/code><\/p>\n<h4>Horde et compagnie<\/h4>\n<p style=\"text-align: justify;\"><a class=\"billet\" href=\"http:\/\/www.horde.org\/download\/app\/?app=horde\">T\u00e9l\u00e9chargez<\/a> puis d\u00e9compressez le fichier <i>horde-X.Y.Z.tar.gz<\/i> pour placer les fichiers obtenus dans <i>\/srv\/www\/horde<\/i>. Proc\u00e9dez de m\u00eame avec <a class=\"billet\" href=\"http:\/\/www.horde.org\/download\/app\/?app=imp\">IMP<\/a> et <a class=\"billet\" href=\"http:\/\/www.horde.org\/download\/app\/?app=turba\">Turba<\/a>, en pla\u00e7ant les fichiers respectivement dans <i>\/srv\/www\/horde\/imp\/<\/i> et dans <i>\/srv\/www\/horde\/turba\/<\/i>.<\/p>\n<p style=\"text-align: justify;\">Trean n'\u00e9tant pas encore finalis\u00e9, il n'est accessible que via les <a class=\"billet\" href=\"http:\/\/ftp.horde.org\/pub\/snaps\/latest\/\">snapshots CVS<\/a>. Placez dans un sous-r\u00e9pertoire comme les autres. Il faut aussi l'activer : \u00e9ditez le fichier <i>\/srv\/www\/horde\/config\/registry.php<\/i>, fa\u00eetes une recherche sur \u00ab trean \u00bb et modifiez la ligne \u00ab status \u00bb :<\/p>\n<p><code>'status' => 'active',<\/code><\/p>\n<p style=\"text-align: justify;\">Ouvrez ensuite l'URI <i>https:\/\/horde.serveur.tld\/test.php<\/i> pour v\u00e9rifier que votre installation de PHP comporte tous les \u00e9l\u00e9ments n\u00e9cessaire \u00e0 Horde.<\/p>\n<p style=\"text-align: justify;\">Par d\u00e9faut, Horde semble s'attendre \u00e0 \u00eatre plac\u00e9 dans un sous-r\u00e9pertoire \u00ab horde3 \u00bb \u00e0 la racine du site. Pour \u00e9viter des grognements du style :<\/p>\n<p><code>[Sat Oct 21 23:13:16 2006] [error] [client 192.168.111.254] File does not exist: \/srv\/www\/horde\/horde3<\/code><\/p>\n<p style=\"text-align: justify;\">On ex\u00e9cutera cette commande apr\u00e8s s'\u00eatre plac\u00e9 dans <i>\/srv\/www\/horde<\/i> :<\/p>\n<p><code># ln -s . horde3<\/code><\/p>\n<p>Par mesure de s\u00e9curit\u00e9 :<\/p>\n<p><code># chown -R root:root \/srv\/www\/horde<\/code><\/p>\n<p>Pour pouvoir acc\u00e9der \u00e0 la configuration via le navigateur :<\/p>\n<p><code># chown -R www-data.www-data \/srv\/www\/horde\/config \/srv\/www\/horde\/imp\/config \/srv\/www\/horde\/turba\/config \/srv\/www\/horde\/trean\/config<\/code><\/p>\n<p style=\"text-align: justify;\">Dans le paquet debian horde3, vous trouverez un fichier SQL. Importez-le dans MySQL et cr\u00e9ez un utilisateur pour Horde.<\/p>\n<p style=\"text-align: justify;\">La majeure partie du reste de la configuration va s'effectuer par le biais de votre navigateur, \u00e0 l'adresse \u00ab https:\/\/horde.serveur.tld \u00bb. Notez que si vous n'avez pas de serveur IMAP fonctionnel, horde ne fonctionnera pas.<\/p>\n<p style=\"text-align: justify;\">Pour les param\u00e8tres essentiels, ensuite dans \u00ab Administration > Configuration > Configuring Horde \u00bb. Dans la section \u00ab Database \u00bb, sp\u00e9cifiez qu'on va utiliser MySQL, et entrez les infos de connection. S\u00e9lectionnez UTF-8 comme encodage. Dans la section \u00ab Authentification \u00bb, entrez le ou les utilisateur(s) qui seront administrateurs. Puis s\u00e9lectionnez \u00ab IMAP authentification \u00bb comme m\u00e9thode d'identification, pour \u00ab Configuration type \u00bb entrez \u00ab Separate values \u00bb. Choisissez le port 143 et le protocole \u00ab imap\/tls\/novalidate-cert \u00bb.<\/p>\n<p style=\"text-align: justify;\">Si quelque chose se passe mal et que vous voulez revenir en connexion automatique, \u00e9crasez <i>\/srv\/www\/horde\/config\/conf.php<\/i> par sa sauvegarde et rechargez \u00ab https:\/\/horde.serveur.tld \u00bb.<\/p>\n<p style=\"text-align: justify;\">\u00c9ditez ensuite <i>\/srv\/www\/horde\/imp\/config\/servers.php<\/i>.<\/p>\n<pre>$servers['imap'] = array(\n    'name' => 'IMAP Server',\n    'server' => 'localhost',\n    'hordeauth' => true,\n    'protocol' => 'imap\/ssl\/novalidate-cert',\n    'port' => 143,\n    'maildomain' => 'almic.tf',\n    'smtphost' => 'mx.almic.tf',\n    'smtpport' => 25,\n    'realm' => '',\n    'preferred' => '',\n);<\/pre>\n<p style=\"text-align: justify;\">On utilise SSL car la sarge n'a que PHP4, or il faut PHP 5.1 pour utiliser TLS.<\/i><\/p>\n<p style=\"text-align: justify;\">Pour Turba, il faut importer dans MySQL <i>\/srv\/www\/horde\/turba\/scripts\/sql\/turba_objects.mysql.sql<\/i>.<\/p>\n<p style=\"text-align: justify;\">Faites ensuite le tour de la configuration d'Horde, d'IMP, de Turba et de votre ou vos compte(s) utilisateur(s) pour les adapter \u00e0 vos besoins.<\/p>\n<h2>Remerciements et liens<\/h2>\n<p style=\"text-align: justify;\">Pour la partie Postfix, la <a class=\"billet\" href=\"http:\/\/postfix.traduc.org\/\">traduction fran\u00e7aise de la doc<\/a> m'a beaucoup aid\u00e9, en particulier la <a class=\"billet\" href=\"http:\/\/postfix.traduc.org\/index.php\/postconf.5.html\">liste de tous les param\u00e8tres<\/a> du fichier de configuration.<\/p>\n<p style=\"text-align: justify;\">Si vous voulez appronfondir l'aspect anti-spam, rendez-vous sur <a class=\"billet\" href=\"http:\/\/asdrad.9online.fr\/anti_spam\/guide_anti-spam.html\">cette page<\/a>.<\/p>\n<p style=\"text-align: justify;\">Enfin, vous trouverez <a class=\"billet\" href=\"http:\/\/www.linux-france.org\/article\/appli\/procmail.html\">ici<\/a> plus de d\u00e9tails sur la syntaxe de Procmail.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avec postfix, dovecot et fetchmail, on peut g\u00e9rer le mail pour un ou plusieurs noms de domaine, cr\u00e9er des alias, utiliser des tags (utilisateur+tag@domaine.tld), regrouper les mails venant de plusieurs h\u00e9bergeurs sur un seul compte\u2026 entre autres. Ce tutoriel a \u00e9t\u00e9 tenu \u00e0 jour jusqu\u2019au 29 ao\u00fbt 2014.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-37","post","type-post","status-publish","format-standard","hentry","category-hebergement","radius"],"_links":{"self":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/37","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/comments?post=37"}],"version-history":[{"count":85,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/37\/revisions"}],"predecessor-version":[{"id":768,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/37\/revisions\/768"}],"wp:attachment":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/media?parent=37"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/categories?post=37"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/tags?post=37"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}