Aller au contenu principal
Sujet: Code de filtrage procmail (Lu 2561 fois) sujet précédent - sujet suivant

Code de filtrage procmail

Bonjour, un truc m'échappe, j'y arrive pas....

Il y a peut être parmi vous quelqu'un qui peu m'aider car toutes mes recherches sur internet ou demande dans d'autre forums dédié à linux n'ont rien donné.
Oui, je sais il y a une doc très complète avec des exemples en pagaille parfois très compliqués, il y a aussi moyen d'utiliser un anti-spam tout fait, mais j'aime pas car ça fait ce que ça veut!
 Je m'explique: A chaque fois que je veut appliquer une recette, je n'obtiens jamais le résultat de tri espéré. J'y arrive que lorsque je rentre les adresses à filter en entier et avec les "<>" qui l'entoure dans le "from" ou autre. C'est à mon goût lourd et ça implique des listes interminables d'adresses à entrer. Je souhaite utiliser un tri plus intelligent...
La ponctuation a utiliser est peut décrite et il est fait référence que l'outil de recherche intégré est "egrep". Hors ce qui fonctionne avec cette commande ne fonctionne pas dans procmail et inversement, donc je patauge, tout mes essais échouent invariablement.

Exemples de recettes:
# Spam
:0
* ^From:'(mail|news|promotion)'

$MAILDIR/Poubelle/new
Effet recherché: Tout les mails contenant news ou dans une partie du mot comme newsletter (entre autre) dans l'adresse: a la poubelle
Effet obtenus: Aucun tri, les messages contenant les mots clés se retrouvent dans ma boite de réception

Si j'active cette recette:
# Règle d'indésirables non explicitement adressé bien classé à "l'horizontale" (complément spam).
# :0
# * !(To|Cc):'(Machin TRUC|machintruc@ltartempion.com|etc...)'

# $MAILDIR/Poubelle/new

Tout les mails pourtant bien adressé se retrouvent dans ma corbeille.

J'ai essayé tout un tas de ponctuation avec entre autre des ".*" , jusqu'à en mettre de partout, avec ou sans guillemets, j'ai jamais le résultat attendu.

Re : Code de filtrage procmail

Répondre #1
Bonjour,

Je ne connais pas, j'essaie de voir…

Que donne la commande:
echo $(echo $MAILDIR)/Poubelle/new

Essaie cette expression régulière:
* ^From:'.*(mail|news|promotion).*'

Ou sans le simple guillemet peut-être:
* ^From:.*(mail|news|promotion).*

Re : Code de filtrage procmail

Répondre #2
Hello,

Je me suis bien pris la tête sur Procmail il y a de nombreuses années, parmi tous les marque-pages que j'avais conservés seul celui-ci fonctionne encore : https://www.gsp.com/cgi-bin/man.cgi?section=5&topic=procmailrc (mais c'est en anglais)

J'ai retrouvé une de mes règles (moins ambitieuse que les tiennes)
:0H:
* ^Subject: *****SPAM*****
spam

Un modeste conseil faut de mieux, essaye d'y aller petit à petit en ne classant par exemple au début que les emails promotion et en vérifiant si cela fonctionne.

Bon courage

Re : Code de filtrage procmail

Répondre #3

Un modeste conseil faut de mieux, essaye d'y aller petit à petit en ne classant par exemple au début que les emails promotion et en vérifiant si cela fonctionne.

Bon courage

Merci, c'est exactement ce que je faisait au début, mais ça implique d'entrer les adresses en entier avec des listes interminable difficiles à maintenir à jour!

Re : Code de filtrage procmail

Répondre #4

Que donne la commande:
echo $(echo $MAILDIR)/Poubelle/new
pepit@wawa:~> echo $(echo $MAILDIR)/Poubelle/new
/Poubelle/new

Essaie cette expression régulière:
* ^From:'.*(mail|news|promotion).*'
Pas mieu!

Ou sans le simple guillemet peut-être:
* ^From:.*(mail|news|promotion).*
C'est ce que j'utilisais jusqu'à lors, implique les adresses complète avec les "<>" en liste interminable

Ça parait pourtant pas bien compliqué et puissant de prime abord, mais au final c'est un casse tête, et j'arrive pas à trouver l'info!
Mais au vue de tes capacités et implications impressionnante je ne serait pas surpris que tu trouves la (les) solution(s)!  ;) 

Re : Code de filtrage procmail

Répondre #5
Bonjour,
  • Fais-voir ton fichier /etc/procmailrc (pour les envois), et ~/.procmailrc (pour la réception).
  • As-tu essayé une autre recette, qui elle fonctionne ?

Tu peux aussi essayer d'utiliser procmail en anglais pour avoir le message d'erreur en anglais. Peut-être y-a-t-il plus d'informations pour résoudre ton problème…

Re : Code de filtrage procmail

Répondre #6
Oui, j'ai eu des recettes qui fonctionnaient sur ce système mais non optimisées, je suis jamais arrivé au résultat attendu, du coup ça m'obligeais à faire des listes interminable très compliquées à maintenir. Le reste de ma config fonctionne parfaitement, c'est juste les recettes à améliorer.

Bon je viens d'essayer celle-ci sans les "guillemets" et sans les ".*" devant et derrière les parenthèses mais seulement autour de toutes les chaînes de caractères recherchées, ponctuation que je n'avais encore jamais essayée:
* ^From:(.*mail.*|.*news.*|.*promotion.*)

Ca semble fonctionner, c'est pas la même logique qu'en mathématique!  Du coup j'ai réactivé l'autre sous la même forme:
# Règle d'indésirables non explicitement adressé bien classé à "l'horizontale" (complément spam).
:0
* !(To|Cc):(.*Machin TRUC.*|.*moi@ltartempion.com.*|.*etc....*)

# $MAILDIR/Poubelle/new
Résultat au prochain courrier ou spam reçus répondant à ces définitions, ce qui ne saurait tarder!!!

Re : Code de filtrage procmail

Répondre #7
Oui, bizarre, intéressant. Les expressions régulières, selon la situation (bash, python, …), ont parfois des petites différences. Avec procmail par exemple, {n,m} pour décrire une répétition n'existe pas…
Citer
Notably absent is the {m,n} construct found in many modern extended regular expression implementations.

Le format d'une recette est:
:0 [flags] [ : [locallockfile] ]
[* reg_exp]
[* reg_exp]
...
action_a_effectuer

Selon ce format, au lieu de grouper mail, news et promotion, tu peux établir trois recettes (une par ligne).
# Spam
:0
* ^From:.*mail.*
* ^From:.*news.*
* ^From:.*promotion.*

$MAILDIR/Poubelle/new

Ensuite, si cela ne filtre pas, il faut plus d'informations. Par exemple un email non filtré au format texte pour voir où ça coince.

autres liens:
https://userpages.umbc.edu/~ian/procmail.html
https://porkmail.org/era/procmail/quickref

Re : Code de filtrage procmail

Répondre #8
Heu oui, bien sur, mais sur de grande liste, c'est franchement compliqué, pour info ma recette anti indésirables qui présente déjà une grande efficacité mise à jour ce soir:
# 1) Spam
:0
* ^From:(.*deals.*|.*Facebook.*|.*Franfinance.*|.*info.*|.*LinkedIn.*|.*mail.aliexpress.*|.*@mail.paypal.*|.*news.*|.*notifications.*|.*promotion.*|.*SOFINCO.*|.*TwoNav.*|.*Vogavecmoi.*)

$MAILDIR/Poubelle/new

J'obtiens ainsi quasiment le même résultat sur une seule ligne que celle que j'avais avant avec les adresses en entier,  comportais au bas mot une quinzaine de ligne, précédée par une liste blanche maintenant absente de même taille!.

J'avais du augmenter le nombre de caractères autorisé par défaut  dans les recettes avec:
LINEBUF=16384 #Augmentation de la longueur des recettes (2048 par défaut à 32768)

Re : Code de filtrage procmail

Répondre #9
Par contre ma seconde recette anti-spam ne fonctionne toujours pas malgré le même format:
# 2) Règle d'indésirables non explicitement adressé bien classé à "l'horizontale" (complément spam).
:0
* !(To|Cc):(.*Moi MonNom.*|.*pseudo@gmail.com.*|.*pseudo@orange.fr.*|.*pseudo@hotmail.com.*)

$MAILDIR/Poubelle/new

Pourquoi?

Re : Code de filtrage procmail

Répondre #10
Si tu cherches les mails suivant leur adresse dans To ou Cc cela devrait être ressembler à ça:

^(To|Cc).+(Moi MonNom|pseudo@gmail\.com.|pseudo@orange\.fr|pseudo@hotmail\.com)

Re : Code de filtrage procmail

Répondre #11
Je ne suis pas sur que procmail comprenne cette ponctuation!

D'après les man pages le "+" n'existe pas. je ne comprend pas non plus la "\" car il est écrit ceci:
Citer
\    To quote any of the above at the start of the line.

le  "^"avant " from, to, cc, indique à procmail de chercher à partir du début de la ligne. hors ce que je cherche à faire ici est non pas de chercher les caractères présent dans ma liste pour les mettre à la poubelle, ce qui reviendrais a jeter tout les mail qui me sont adressé, mais exactement l'inverse!

D'après les man pages:
Citer
!    Invert the condition.
En fait ici je cherche si les caractères de ma liste sont absent pour diriger les mails concerné à la poubelle.

Cette recette fonctionnais lorsque j’entrai mes adresses comme ceci: .*(<moi>|<moi@tartempion>|etc).*; mais il y avais des trous dans la raquette, car il suffisait que les "<>" n'y soient pas ou qu'il y ai des espaces.

Ceci dit, étant loin d'être bon,  j'attends le résultat de ma dernière correction, et si elle s'avère inefficace j'essaierai les ".+" et les "\" pour voir ce que ça fait.
 

Re : Code de filtrage procmail

Répondre #12
D'après les man pages le "+" n'existe pas.

un peu plus loin dans le 'man procmailrc' il est aussi écrit
Extended regular expressions
       The  following tokens are known to both the procmail internal egrep and the standard egrep(1) (beware that some egrep implementations include other non-standard extensions; in particular, the repetition operator { is not supported by
       procmail's egrep):

.         Any character except a newline.

a+        Any sequence of one or more a's.

\.        Matches a single dot; use \ to quote any of the magic characters to get rid of their special meaning.  See also $\ variable substitution.
→ C'est une expression régulière.

Quant à
\    To quote any of the above at the start of the line.

Permet de "quoter (échapper)" par exemple le point d'exclamation ! en début de ligne => si tu veux décrire une expression régulière commençant par ! .
Ici, dans une condition (donc après * ), le ! n'est pas à proprement dit une expression régulière, c'est un caractère dont le rôle est propre à procmail:
There are some special conditions you can use that are not straight regular expressions.  To select them, the condition must start with:
!    Invert the condition.
Pour résumer:
  • * !regex
    Cherche la négation de regex
  • * \!regex
    Cherche l'expression régulière définie par !regex (commençant par ! …)
Regarde le contexte dans le man où est écrit cette remarque…

Re : Code de filtrage procmail

Répondre #13
C'est vrai que l'anglais et moi ça fait pas bon ménage, du coup, les traductions google n’intègre pas les subtilité du langage, surtout s'il est technique; Et même sans ses excuses ça reste compliqué, je ne suis pas programmeur, pour moi "a+ "est une entité alors qu'en fait le "a" n'était que l'exemple remplaçable.C'est vrai que l' "*" je l'avais intégré sous forme d'exemple. Bref, même avec vos aide extra, j'ai du mal à comprendre!

Si je comprend pas très bien en somme: "a*" désigne toute séquence de zéro ou caractères alphabétiques et le a+ que des séquences de caractères alphabétique. Sauf qu'avec un point devant censé remplacer n'importe quel caractère y compris les zéros j'ai du mal à saisir la différence entre "*" et "+"

Toujours est il que ma dernière mouture semble fonctionner. En fait j'ai l'impression que lorsque procmail trouve une erreur dans une recette, elle n'est pas exécutée du tout. Hors dans ma recette j'avais écrit ceci:
* !(To|Cc):(.*Monprénom MonNom.*|.*pseudo@gmail.com.*|.*pseudo@orange.fr.*|.*pseudo@hotmail.com.*)

Procmail semble mal digérer l'espace entre Monprénom et Monnom... Ce qui donne:
* !(To|Cc):(.*MonNom.*|.*pseudo@gmail.com.*|.*pseudo@orange.fr.*|.*pseudo@hotmail.com.*)
Et là, ce soir, j'ai reçu un message dont le "to" ne comportais aucunes des 4 chaînes de caractères ci-dessus et donc retrouvé dans ma poubelle!  :)

A confirmer, j'en attend d'autre à filtrer entre le dimanche et le lundi de chaque semaine...