Nicofon|{   |  mémo autour du logiciel
Supprimer le spam sur une boite mail free.fr avec imapfilter

Historiquement, j’utilise une adresse mail en free.fr. Malheureusement celle-ci était plus que spammée, environ 30 mails de spams par jour. Ce qui est drôle c’est que Free utilise un antispam mais ne fait pas l’effort de l’utiliser pour classifier automatiquement les mails afin d’avoir une boite propre et des clients heureux.

La classification du SPAM chez free.fr

En ouvrant le source de chaque mail il y a un header magique qui catégorise le mail. Une petite recherche sur le net avec X-ProXaD-SC et vous trouverez des infos diverses sur les valeurs que peut prendre ce champ. Commençons par analyser le format de ce header, il est définit ainsi state=<state>:<category> score=<score>. Après observation les champs de ce header varient ainsi:

  • state: HAM ou SPAM
  • category(HAM): aucune, CommercialEmailGeneric, CommercialEmailKnown ou SocialNetwork
  • category(SPAM): aucune
  • score: un nombre de 0 à n

Ci-dessous un exemple:

X-ProXaD-SC: state=HAM:CommercialEmailKnown score=7

Filtrer votre boite avec imapfilter

Dans mon cas j’ai effectué mon filtre avec l’outil imapfilter mais vous pouvez très bien utiliser un webmail ou un client mail. Pour faire simple je redirige tous les emails commerciaux dans Junk, les mails des réseaux sociaux dans un répertoire que j’ai créé Social et tous les mails avec un score supérieur à 10 directement dans la poubelle aka Trash.

Avec imapfilter vous pouvez donc définir les règles de filtrage dans un fichier de config en LUA. L’ensemble des primitives pour filtrer sont disponibles sur le man d’imapfilter_config. Et pour ceux qui veulent directement faire le ménage voici ma config pour mon adresse free.fr. Pour l’exécuter il suffit de lancer la commande imapfilter et de renseigner votre mot de passe. Le filtrage sera fait toute les 60s ce qui n’empêche pas d’avoir des notifications des pourriels mais au moins le tri est automatique derrière.

function filter_spam()
    spam = Set {}
    social = Set {}
    commercial = Set {}
    
    results = account.INBOX:is_unseen()
    
    for _, msg in ipairs(results) do
        mbox, uid = table.unpack(msg)
        spamcause = mbox[uid]:fetch_field("X-ProXaD-SC")
        state, category, score = string.match(spamcause, "state=(%a+):?(%g*) score=(%d+)")
        score = tonumber(score) or 0

        print("> state(" .. (state or "") .. ") category(" .. (category or "") .. ") score(" .. (score or "") .. ")")

        if state == "HAM" and (category == "CommercialEmailGeneric" or category == "CommercialEmailKnown")  then
            table.insert(commercial, msg)
        elseif state == "HAM" and category == "SocialNetwork" then
            table.insert(social, msg)
        elseif (state == "SPAM" or state == "HAM") and score > 10 then
            table.insert(spam, msg)
        end

    end
    commercial:move_messages(account.Junk)
    social:move_messages(account.Social)
    spam:move_messages(account.Trash)
end

account = IMAP {
    server = 'imap.free.fr',
    username = '<votre login free>',
    password = get_password('Enter password: '),
    port = 993,
    ssl = 'auto'
}

become_daemon(60, filter_spam)