Vous êtes sur la page 1sur 7

Postfix ,Dovecot et Siève

Objectif
1) Utiliser Dovecot comme LDA pour postfix
2) créer des listes de diffusion
3) Utiliser Dovecot pour l'authentification SMTP
4) Filtrer les messages à l'aide de dovecot grace au protocole siève

1 )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).

Pour cela, 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 dans le fichier /etc/dovecot.conf.


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@rtn.sn

2. Creation de liste de diffusion

Il suffit d'éditer le fichier /etc/aliases et ajouter par exemple:


ing: felixcampal@gmail.com jean@rtn.sn ouya

et taper la commande newaliases


Quand un mail est envoyé à ing alors felixcampal jean et ouya vont le
recevoir.

NB: Procmail est un MDA permettant de faire des filtres très complexes (et beaucoup d’autre
chose aussi), ce qui le rend très compliqué. ( Un bon technicien doit au moins l'essayer )
Par contre Sieve sera largement suffisant pour des usages classiques , il est normalisé aux MDA
tels que cyrus-imap et dovecot.

4) Activation de Sieve
Pour activer Sieve dans Dovecot , dans /etc/dovecot.conf , 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 la maildir.
Rajouter les lignes suivantes dans l’ensemble « plugin {} » :
# Settings for the Sieve plugin
sieve=~/mails/.dovecot.sieve
sieve_dir=~/mails/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=~/mails/.dovecot.sieve
sieve_storage=~mails/sieve

Redémarrez postfix et dovecot puis configurez votre client mail pour utiliser votre compte sur votre
serveur. Vous devrez alors pouvoir créer vos scripts Sieve.

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).

Voici Quelques exemples :


# 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"] ["ing"] {
fileinto "Mailing-lists/ing";
stop;
}

# ...

# Tri en fonction de l'expéditeur


#################################

# Famille
if anyof( header :contains ["From"] ["marie.ouya@rtn.sn"],
header :contains ["From"] ["boris@gmail.com"],
header :contains ["From"] ["sara.ouya@rtn.sn"],
header :contains ["From"] ["tetine@hotmail.com"] ) {
fileinto "Famille";
stop;
}

# ...

# Tri un peu plus complexe


#################################

#
if anyof( header :contains ["To"] ["@rtn.sn"],
header :matches ["List-Id"] ["*.ec2lt.sn"] ) {
fileinto "groupertn";
stop;

Problématique de filtrage de mail

Filtrage des mails


L'intrusion de mails indésirables (publicité, virus ...) nous amène à vouloir filtrer le courrier que
nous recevons. Ce tri peut se faire coté client (c'est à dire depuis mon PC) ou coté serveur.

Coté client
Avec un filtrage coté client le mail sera toujour délivré dans ma boite de réception, le tri se faisant
lorsque mon logiciel client se connectera au serveur pour réceptionner le courrier.
Coté serveur
Avec un filtrage coté serveur, c'est lorsqu'un mail arrive qu'il est placé dans le bon repertoire, ou
bien s'il est indésirable: détruit ou renvoyé.

Le langage "sieve"
Le langage "sieve" est un langage trés simple qui permet de trier le courrier entrant en fonction
uniquement de ce que peut contenir l'entête du mail. Pour des raisons d'efficacité ce langage permet
seulement des tests conditionnels, il n'autorise pas:
 les boucles
 les variables
 l'analyse du corps du message
Dans ces conditions il ne peut pas y avoir d'analyse sans fin, et même en cas d'erreur de syntaxe le
courrier sera toujour délivré dans la boite à lettre par défaut de l'utilisateur.

Structure du langage
Il existe trois type de structures: les actions, les contrôles et les tests.

Les actions
C'est un verbe suivi d'un argument optionnel qui est toujour une chaine de caractères. L'action se
termine par un ";". Les actions sont de deux familles: les actions de contrôle et les actions sur les
mails.

Les actions de contrôle


 stop Arrète l'exécution du script. Cette action n'a pas d'argument.
Exemple : stop;
 require En début de script indique les actions optionnelles passées en argument (qui ne
sont pas dans l'inplémentation standard de sieve mais qui "devraient" y être) qui seront
utilisées.
Exemple : require "fileinto";

Les actions standard sur les mails


 keep Action par défaut, elle est implicite. Cette action n'a pas d'argument.
 redirect L'équivalent de "faire suivre" avec l'adresse de destination comme argument.
Exemple : redirect "une.autre.adresse@un.autre.domaine";
 discard Détruit le mail sans en informer l'emetteur. Cette action n'a pas d'argument.
Exemple : discard;

Les actions optionnelles sur les mails


Toutes les implémentation de sieve ont les actions standards et devraient avoir ces actions
optionnelles. Cyrus les possède. Dans tous les cas il faudra préalablement une action require.
require "reject";
require "fileinto";
require "vacation";
Ou :
require ["reject","fileinto","vacation"];

 reject Rejette le mail et renvoie à l'emetteur le message passé en argument


Exemple : reject "Je ne veux plus de tes nouvelles";
 fileinto Dépose le mail dans la boite passée en argument.
Exemple : fileinto "INBOX.Perso";

 vacation C'est la réponse automatique. Cette commande prend trois arguments :
 :days En argument le nombre de jours avant de renvoyer un nouveau mail
d'abscence à un emetteur déjà informé dans le cas où celui ci me recontacterait de
nouveau.
 :address En argument l'adresse de celui qui est abscent.
 :text En argument le message à renvoyer.

Exemple : vacation :days 7 :address "samuel.ouya@gmail.com"


:text "Abscent jusqu'au 16/11/2009";

Les contrôles
Ce sont les entités sur lesquelles on peut effectuer des tests. Certaine entités nécessites un ou
plusieurs arguments.
 header Tous les champs de l'entête. L'argument est un hearder ou une liste de headers.
Exemple :
 header "from"
 header ["from","to","bcc","cc"]
 address Tous les champs de l'entête contenant une adresse ou une partie d'adresse. Il y a
deux niveau d'argument. Le premier spécifie sur quelle partie de l'adresse on travailles et le
second pour quel header ou liste de headers.
 :all Toute l'adresse.
 :localpart La partie à gauche du @.
 :domain La partie à droite du @. Exemple :
 address :all "from"
 address :domain ["from","resent-from","resent-
to","received"]
 size La taille de mail comparée à un nombre par défaut en octets sinon en K ou M.
 :over
 :under Exemple : Si la taiile du mail (entête comprise) est > 5 Mo le résultat est
"vrai" : size :over 5M
 exists Un champ de l'entête est présent ou non. Exemple : exists
["from,"date"]
 envelope Les champs de l'enveloppe au sens SMTP avec les mêmes arguments que pour
address.

Les tests
Les tests on lieu sur des contrôles, le résultat du contrôle est évalué par un opérateur logique.
 allof ET
 anyof OU
 false FAUX
 true VRAI
 not NON Exemple :
 allof(false,true) est FAUX
 not false est VRAI

Les structures conditionnelles


La seule structure conditionnelle existante est: if ...elseif ...elseif ...else

Les comparateurs et les opérateurs


Les comparateurs
Les chaines de caractères sont compatées bit à bit ou caractère par caractère dans le jeux UTF-8 en
ignorant les majuscules/minuscules.
 i;octet Comparaison bit à bit
 i;ascii-casemap Comparaison par caractères. Par défaut

Les opérateurs
Une fois le mode de comparaison choisi on va choisir l'opérateur de comparaison.
 :is Les deux chaines sont comparées exactement. Par défaut
 :contains Une chaine est une sous chaine de l'autre
 :matches Comme pour :contains main en utilisant des caractères de substitution.
Exemple : header :contains ["from","to"] ["chaine1","chaine2"]
Si les headers from ou to contiennent soit la chaine chaine1 soit la chaine chaine2
l'évaluation est VRAIE. La même chose s'écrit:
header :matches ["from","to"] ["*chaine1*","*chaine2*"]
Comme le comparateur n'est pas indiqué, c'est i;ascii-casemap qui est utilisé.

Remarque
Le comparateur i;octet n'a de sens qu'avec l'opérateur :is

Bloc
Un bloc est une action qui suit un test. l'action est alors entre accolades "{}".
Exemple : address :localpart :contains "from"
["sara","boris","morez"] { fileinto "Enfants";}
Que l'on peut traduire par: "si la partie gauche de l'adresse contenue dans le champ "from" du
header contient soit "sara" soit "boris" soit "morez" alors déposer le mail dans la boite nommée
"Enfants".

Exemples
Opérateur logique "not"
if not exists header ["from","date"] {discard;}
Si les headers "from" ou "date" ne sont pas présents dans le header alors éliminer le mail sinon on
l'achemine dans la INBOX. La forme explicite serait:
if not exists header ["from","date"] {discard;} else {keep;}

Contrôle "size"
if size :over 5M {reject "Ce mail est trop volumineux";}
Si la taille d'un mail dépasse les 5 méga octets l'expéditeur recevra un message de non délivrance de
son courrier pour le motif "mail refusé" avec le message "Ce mail est trop volumineux".

Opérateur logique "anyof"


if anyof ( not address :all :contains ["to","cc",bcc"] "samuel.ouya@gmail.com",
header :matches "subject" ["*toto*","*titi*"] )
{fileinto "spam";}
else
{keep;}

Premier test: si les champs "to", "cc" ou "bcc", du header ne contiennent pas mon adresse, alors
l'expression est vraie. Second test: si le champ "subject" du header contient soit la chaine "titi" soit
la chaine "toto" alors l'expression est vraie. Puisque entre ces deux expressions on a un "anyof" (ou)
il suffit que l'une des deux expression, seulement, soit vraie pour que le mail soit délivré à la boite
"spam".

Contrôle "header"
Si un header listé existe il peut contenir la chaine nulle "" ce qui n'est pas le cas s'il n'existe pas.
Supposons que l'on ai le header "X-cafe: bof" et le header "X-the: hum" et aucun autre
header. On aura les évaluations suivantes:
header :is "X-cafe" "" faux
header :is "X-cafe" "bof" vrai
header :contains "X-cafe" "" vrai
header :contains "X-cafe" ["bof","hum"] vrai
header :contains "X-the" ["bof","hum"] vrai

Vous aimerez peut-être aussi