date: 06 Nov 2009 title: Home serveur : tri du courrier avec Sieve tags: dovecot, mail planet-libre, sieve, auto-hébergement xrefs: home-serveur-installation-du-serveur-web.txt, home-serveur-configuration-du-serveur-imap-dovecot.txt, home-serveur-premiers-reglages.txt, home-serveur-proteger-son-serveur-configuration-du-pare-feu.txt, home-serveur-proteger-son-serveur-configuration-de-fail2ban.txt, home-serveur-recuperer-ses-mail-avec-fetchmail.txt, home-serveur-installation.txt, home-serveur-quelques-astuces-bien-utiles.txt, home-serveur-configuration-du-serveur-de-mail-postfix.txt, home-serveur-utilisation-de-cles-pour-ssh.txt, home-serveur-openssh.txt, home-serveur-sauvegarde-des-maildirs.txt Aujourd'hui, on va voir comment trier le courrier entrant en fonction de divers paramètres. Par exemple si vous êtes abonné à des listes de diffusion, si vous voulez regrouper vos mails en fonction de l'expéditeur, ... Dans le prochain article j'expliquerai comment rapatrier les mails de vos autres comptes (gmail, hotmail, ...) sur votre serveur. Donc on va voir aussi comment séparer les mails de vos différents comptes. Vous avez sûrement entendu parler de Procmail, qui permet de faire des filtres très complexes (et beaucoup d'autre chose aussi), ce qui le rend très compliqué. Sieve sera largement suffisant pour notre usage, et il est supporté par Dovecot. De plus il est normalisé. ## Configuration du MDA On va configurer Dovecot pour qu'il se charge de jouer le rôle de MDA (Mail Delivery Agent) (appelé LDA dans le fichier de configuration, L pour Local). Première étape, on va dire à Postfix d'utiliser Dovecot comme MDA (ou LDA). Dans le fichier /etc/postfix/main.cf, modifiez la ligne "mailbox_command" comme ceci : mailbox_command = /usr/lib/dovecot/deliver Relancez postfix et ça suffira pour le MTA. Coté configuration de Dovecot, il faut activer le MDA. Recherchez la ligne "protocol lda {" et décommentez la (sans oublier l'accolade fermante qui va avec). Tant que vous y êtes, dans l'ensemble "protocole lda {}", modifiez l'adresse mail où seront envoyés les mails d'erreurs : postmaster_address = postmaster@mon-domaine.tld Remplacez bien mon-domaine.tld par votre domaine. Vous pouvez laisser l'utilisateur postmaster, car, de toute façon, tous les mails envoyés à root, postmaster, nobody... sont redirigés vers votre compte. Regardez le fichier /etc/aliases pour modifier tout ça si vous voulez. ## Activation de Sieve Sieve est un plugin à Dovecot. La version packagée de Dovecot présent dans les dépôts Debian contient normalement le plugin, vous n'avez alors qu'à l'activer dans le fichier de configuration (il suffit de décommenter la ligne mail_plugins de l'ensemble protocol lda {}, comme ceci) : protocol lda { ... mail_plugins = cmusieve ... } Ensuite, indiquez lui où vous voulez mettre vos scripts Sieve, généralement à la racine de votre home. Rajouter les lignes suivantes dans l'ensemble "plugin {}" : # Settings for the Sieve plugin sieve=~/.dovecot.sieve sieve_dir=~/.sieve Le répertoire .sieve contiendra tous les scripts de l'utilisateur, et le fichier .dovecot.sieve est en fait un lien symbolique vers le script actif, qui se trouve dans le dossier .sieve. ## ManageSieve ManageSieve n'est pas essentiel, mais c'est un plus coté "commodité" : en fait, actuellement, vous devez vous connecter en ssh pour activer/modifier/supprimer vos filtres. Certains clients mail (Kmail, Thunderbird via une extension, et sûrement d'autres) vous proposent une interface pour gérer vos filtres, et éventuellement les éditer. Coté serveur, il faut activer le protocole managesieve pour que ça fonctionne. Rajouter donc "managesieve" à la liste des protocoles dans le fichier /etc/dovecot/dovecot.conf : protocols = … managesieve Puis dans l'ensemble "protocol managesieve {}" indiquez les bons chemins : sieve=~/.dovecot.sieve sieve_storage=~/.sieve Vous devez ensuite ouvrir le bon port dans le pare feu et le routeur : c'est le port TCP 2000. Voici la règle iptables à rajouter : iptables -A INPUT -p tcp --dport 2000 -j ACCEPT Pour le routeur, je vous laisse faire :) Redémarrez tout le bazar, puis configurez votre client mail pour utiliser votre compte sur votre serveur. Vous devrez alors pouvoir créer vos scripts Sieve. [![Kmail - gestion des scripts Sieve](http://univers-libre.net/images/kmail-sieve.png)](http://univers-libre.ne t/images/kmail-sieve.png) ## Création des scripts La partie "système" est terminée, vous pouvez maintenant configurer vos filtres comme vous voulez. Si votre client mail ne gère pas les scripts Sieve, il existe des clients au protocole managesieve, rien que pour éditer les scripts, ou sinon, vous pouvez toujours les écrire avec vim directement sur le serveur (compilez les alors avec la commande /usr/lib/dovecot/sievec). Je vais vous montrer quelques exemple de filtres Sieve (ceux que j'utilise en fait), mais c'est à vous à créer les vôtres en fonction des mails que vous recevez. Pour ça, je vous invite à aller voir cette [page](http://www.systemx.fr/linux/cyrus/sieve/sieve.html) pour comprendre rapidement la syntaxe (ce n'est pas très dur ;) ). À noter que pour ce qui est du filtrage du spam, nous reviendrons dessus dans un prochain article, quand nous installerons un antispam. Voici donc quelques extraits : # On inclut pas mal de commande qui peuvent servir : require ["reject", "fileinto", "comparator-i;ascii-numeric", "relational", "imapflags"]; # Tri des listes de diffusion ############################# # Léa Linux if header :contains ["List-Id"] ["aide.lea-linux.org"] { fileinto "INBOX.Mailing-lists.lea-linux"; stop; } # ... # Tri en fonction de l'expéditeur ################################# # Famille if anyof( header :contains ["From"] ["xx@xx.xx"], header :contains ["From"] ["xx@xx.xx"], header :contains ["From"] ["xx@xx.xx"], header :contains ["From"] ["xx@xx.xx"] ) { fileinto "INBOX.Famille"; stop; } # ... # Tri un peu plus complexe ################################# # Univ Nancy2 if anyof( header :contains ["To"] ["xx@etudiant.univ-nancy2.fr"], header :matches ["List-Id"] ["*.listes-etu.univ-nancy2.fr"] ) { fileinto "INBOX.Univ-Nancy"; stop; }