# [SCRIPT] script de filtrage

## 22decembre

bonjour

Je voudrais créer un script pour entrainer mon filtre à spam.

J'aimerais lire un par un les mails dans le dossier ~/.mail/.inbox.spam/ et si le mot "spam" est absent (c'est qu'il est faux négatif) du mail, je passe le fichier dans bogofilter avec l'option "-u -Ns".

Pareil, si, dans les dossier .inbox.facebook/ .inbox.gentoo/ ... si le mot "spam" est présent (c'est qu'il est faux négatif), alors il faut passer le fichier dans bogofilter avec "-u -Sn".

Comment puis-je faire cela ? (Moi et le bash...)

----------

## truc

Tiens, bizarre, je pensais avoir déjà répondu!?

Bref, il nous manque ta première tentative pour pouvoir gloser autour!

(tu peux commencer à regarder du côté de grep - notamment 'grep -q'- pour savoir si un fichier contient un mot ou pas)

----------

## 22decembre

donc dans le dossier de spam je fais :

grep -L "spam" * (recherche tous ceux qui ne contiennent pas l'entente "spam" posée par bogofilter ou spamassassin, s'ils sont dans le dossier spam, c'est que l'utilisateur l'y a mis, c'est donc un faux négatif)

mais comment envoyer cette liste de fichier à bogofilter (pour réapprentissage) ?

----------

## truc

maiis bogofilter fonctionne comment? C'est une commande? qui prend un fichier en entrée? C'est une page web? C'est un utilisateur à qui il faut envoyer des messages?

----------

## 22decembre

c'est une commande.

En l'occurrence, elle doit ressembler à :

```
bogofilter -d /var/lib/bogofilter -Ns nom_du_fichier
```

----------

## 22decembre

j'ai l'impression que c'est :

```
grep -L "SPAM" *|bogofilter -Ns -d /var/lib/bogofilter"
```

"cherche ceux qui contienne pas SPAM (pas classé par le premier filtre à l'entrée), et dis à bogofilter que c'est pas du ham (N) mais du spam (s) dans la base de données dans /var/lib/bogofilter"

----------

## truc

si bogofilter est capable de lire la liste de fichier en entrée(à la sortie d'un pipe) au lieu de en argument, il semblerait que tu aies répondu toi même à ta question:)

Du coup, pour les faux négatifs, si j'ai bien compris, tu ferais:

```
for box in ~/.mail/.inbox.*; do

   [ -d "$box" ] || continue;

   echo "Entering $box"

   if [ "${box##*.}" = "spam" ] ; then

      cd "$box" && grep -L "SPAM" * | bogofilter -Ns -d /var/lib/bogofilter

   else

      cd "$box" && grep -l "SPAM" * | bogofilter -u -Sn -d /var/lib/bogofilter

   fi

   # nous jouons avec des chemins absolus, pas besoin normalement de revenir 

   # où nous étions avant

done
```

Bon, par contre, es-tu bien sûr que c'est suffisant comme test pour savoir si c'est du spam ou non?

Par exemple, je ne sais pas comment cela fonctionne chez toi, mais, ne cherches-tu pas à savoir, par exemple, si le sujet du message contient SPAM plutôt que tout le message? La recherche doit-elle se restreindre à SPAM en majuscule?

Dans tous les cas, nous devrions pouvoir modifier le code ci-dessus pour l'améliorer

----------

## 22decembre

je recherche en fait le motif "___SPAM___" qui est strictement l'entete de marquage réglé par moi-même dans bogofilter.

grep doit donc rechercher celui-ci exactement !

t'es sur(e) pour les déplacement dans les dossiers ? En l'occurrence, pour les maildir il s'agit de :

~/.mail/cur => boite de reception par défaut

~/.mail/.inbox.spam/cur => spam

~/.mail/.inbox.facebook/cur => facebook

et ainsi de suite.

~/.mail est un choix, le reste, non, c'est le format des dossier maildir (serveur imap)

----------

## truc

 *22decembre wrote:*   

> t'es sur(e) pour les déplacement dans les dossiers ?

 

Non, pas du tout, je ne me base que sur les informations que tu as données jusqu'ici:

fais ce test (qui ne modifie rien nul part)

```
for box in ~/.mail/cur ~/.mail/.inbox.*/cur; do

   cd "$box" || continue

   if [ "${PWD}" = "$HOME/.mail/.inbox.spam/cur" ]; then

      echo "$box: this is the spam box"

      # grep -L "___SPAM___" * | bogofilter -Ns -d /var/lib/bogofilter

   else

      echo "$box"

      # grep -l "___SPAM___" * | bogofilter -u -Sn -d /var/lib/bogofilter

   fi

done
```

Ça va te permettre de vérifier si ce sont bien les répertoires que tu veux etc

Après, si c'est bon, tu pourras probablement juste décommenter les lignes qui effectuent le traitement et ce sera bon.

Mais avant, encore deux trois questions pour être bien sûr:

 Comment au juste les messages taggués avec ___SPAM___ arrivent quand même dans les dossiers autre que celui du spam?

 Ton 'antispam' ne les déplace pas tout seul? (attention, je ne connais pas du tout le produit que tu utilises, n'aies pas peur de dire des évidences!)

 Quasi même question mais sur les mails n'étant pas du spam mais arrivant quand même dans le dossier spam, pourquoi?

----------

## 22decembre

encore une fois, bogofilter est le filtre de spam, il faut lui apprendre à le reconnaître ! Ok ?

J'ai un dossier "spam" dans mon client courriel qui correspond au dossier .inbx.spam. Tous les messages que j'y mets sont donc du spam.

J'ai passé ce dossier à bogofilter, et les autres dossiers, en disant que c'était du spam.

Maintenant, bogofilter a appris et peut donc classer les messages arrivant comme spam, et marque "___spam___" dans le header du courriel. Il pourrait aussi faire plein d'autres choses (un autre motif...).

Il passe le message à postfix, qui le mets dans ma boîte aux lettres. C'est le dernier intervenant, le deliver de dovecot qui pose le message dans le bon dossier. Ça s'appelle sieve, c'est un langage de filtres. J'ai ainsi un filtre sur facebook, un autre sur gentoo, et un sur le spam.

C'est donc bien un élément du serveur mail (deliver de dovecot, missionné par postfix) qui a mis le spam dans le dossier en suivant mes indications inscrites dans le filtre sieve.

Jusqu'ici, aucune intervention de ma part, sauf en tant qu'administrateur du serveur...

Si je veux faire ce script de filtrage, c'est parce que bogofilter a besoin d'un entrainement permanent, qu'il fait des erreurs et que c'est moi qui les corrige.

Il arrive donc qu'il pose un message non-sollicité dans une boîte "classique", auquel cas, je le rebalance dans la boîte "spam" et il doit apprendre que je trouve ce message "spam" => d'où la recherche d'absence du motif dans les messages du dossier "spam".

Inversement, il peut classer des messages "sollicités" comme du spam. Auquel cas, je les récupère de la boîte spam et les rebalance dans la boîte où ils devraient être. Bogofilter doit donc apprendre que ces messages taggués spam n'en sont pas !

Voila pour l'explication en full-HD... Le disque Blu-Ray viendra plus tard     :Wink: 

Je te remercie de m'aider. C'est juste que tu as l'air de maîtriser le bash avec les "||continue;"...

----------

## truc

Cool, un échange d'information bidirectionnel!

Bon, ce qui me manquait et qui maintenant me semble évident   :Embarassed:  est que c'est toi qui manuellement a redéplacé les mails dans la boite kivabien pour relancer l'apprentissage...

Oui, bon... Mais avec tout ça, la solution semble te convenir, ou a t'elle encore un peu besoin d'amour?

 :Wink: 

----------

## 22decembre

on verra bien si c'est bon...

l'interêt c'est d'écrire un script, et tous les matins 2h45, tache cron... C'est ça qu'est cool avec les serveurs : ils font le boulot tout seul !

----------

## 22decembre

on dirait que ça marche...

j'ai légerement modifié le truc :

```
#!/bin/bash

for box in ~/.mail/cur ~/.mail/.INBOX.*/cur; do

   cd "$box" || continue

   if [[ "$box" == *spam* ]]

   then

      echo "$box: this is the spam box"

      grep -L "___SPAM___" * | bogofilter -Ns -d /var/lib/bogofilter

   else

      echo "$box"

      grep -l "___SPAM___" * | bogofilter -Sn -d /var/lib/bogofilter

   fi

done

```

grep contient il une option sur l'age du fichier (du message) ? Parce que plus mes boîtes mail vont vieillir, plus elles vont grossir et rendre le traitement long et inutile puisque le même message ne peut être "appris" qu'une seule fois !

----------

## truc

Pas que je sache, par contre, tu peux probablement t'en sortir avec 'find'

si ton script est executé tous les jours, tu peux probablement juste chercher les fichiers ayant été modifiés pendant cet interval de temps:

```
# dans un repertoire donné

find -mtime -1 -exec grep -l spam '{}' + | bogofilter -machin
```

Bon, et puisque certains vont probablement bondir, si tu ne reçois pas des milliers de mail en l'espace d'une journée, cela est suffisant, mais si c'est le cas, tu regarderas de plus près la commande et les options de xargs que tu utiliseras au lieu du -exec de find

----------

## 22decembre

je pensais lire les mails pas plus de 5 jours... en 5 jours, si il est pas passé c'est qu'il est un fantome !

Tu t'y connais bien en scripts on dirait ! T'aurais pas un truc aussi pour gerer le repertoire de portage par ex ? (je comptais lancer le sujet alors ...)

----------

## truc

Un ch'ti résolu et un autre thread si tu veux remettre le couvert!

Merci;)

EDIT: par contre, dans tes demandes faut vraiment que tu sois plus précis, j'suis vraiment allé à la pêche aux infos ici. On ne prendra pas forcément toujours le temps de faire ainsi et ton message risque de rester sans réponse...

----------

