(Attention ce billet ne concerne que les mails stockés dans des boîtes de type Maildir et non pas Mailbox)

A partir du moment où on a une règle de fitrage dans son fichier .procmailrc qui gère les spams, on peut vouloir que les mails déplacés par cette règle dans le dossier .Junk/ soient mraqués comme non lus.

Imaginons que votre règle soit actuellement :

:0
* ^X-Spam-Flag:.*yes
.Junk/

Le déplacement de mail se fait alors dans .Junk/new/

L'idée est de remplacer ce déplacement par un déplacement .Junk/cur/, mais celà n'est pas suffisant pour que le mail soit marqué comme lu. Il faut également rajouter le flag ":2,S" (:2 par défaut (voir explication sur Wikipedia et S pour "Seen").
Pour celà, on récupère le nom du fichier (en se basant sur $LASTFOLDER qui contient le chemin complet du mail en cours de traitement), et on effectue le déplacement/renommage en même temps.

Dans le cas où on veut effectuer ce marquage pour plusieurs règles, il peut être intéressant de factoriser.

On va donc mettre dans un fichier externe (par exemple ~/.procmailrc.moveandmarkasread) la règle "déplacer et marquer comme lu" :

:0c
$foldername

:0
* LASTFOLDER ?? /\/^/+$
{ tail=$MATCH }

TRAP="mv $LASTFOLDER $foldername/cur/$tail:2,S"

HOST

Pour plus de facilité, on va déclarer en haut de notre fichier .procmailrc une variable pour le chemin de ce fichier (on considère que $HOME est déjà défini)

MOVEANDMARKASREAD=$HOME/.procmailrc.moveandmarkasread

Comme on aura pu le voir dans le fichier en question, il faut définir une variable foldername qui contient votre dossier dans lequel le message devrait être déplacé. Dans notre exemple il s'agit de .Junk/ (ne pas oublier le / final !)

On va ensuite inclure ce fichier externe pour appliquer la règle, grâce à la commande INCLUDERC

Cela donne au final la règle suivante (qui remplace celle d'origine) :

:0
* ^X-Spam-Flag:.*yes
{
  foldername=.Junk/
  INCLUDERC=$MOVEANDMARKASREAD
}