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).
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.
# Léa Linux
if header :contains ["List-Id"] ["ing"] {
fileinto "Mailing-lists/ing";
stop;
}
# ...
# 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;
}
# ...
#
if anyof( header :contains ["To"] ["@rtn.sn"],
header :matches ["List-Id"] ["*.ec2lt.sn"] ) {
fileinto "groupertn";
stop;
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 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 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".
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