Je dispose d'un serveur mail avec cyrus, postfix, ldap et sieve
J'ai cherché un peu partout comment créer des règles pour chaque user, mais j'ai jamais trouvé la réponse sur internet
J'ai retrouvé de l'espoir grâce à la commande sieveshell mais j'ai jamais réussis à la mettre en oeuvre, buggé ?
sieveshell -u toto -a cyradm localhost
Cette commande permet (normalement) de travailler sur le user toto avec un compte admin cyrus (définis dans imapd.conf)
mais j'ai eu beau essayer dans tous les sens, ça n'a jamais pris les données de toto, mais les données du compte /var/spoopl/sieve/global
Si quelqu'un savais m'en dire plus…
Alors j'ai pris mon courage à deux mains et j'ai fait mon propre script :
Tout d'abord un peu de théorie.
Les scripts sieve sont stockés dans /var/spool/sieve/t/toto
Il peut y avoir plusieurs fichiers sieve dans le répertoire mais un seul sera actif !
On déterminera le fichier actif par un lien symbolique appelé defaultbc
Les scripts sont stockés en language “humain” avec l'extension .script ensuite compilé en .bc
Voici un simple exemple de fichier sieve.script
# Antispam
require ["vacation", "regex", "imapflags", "fileinto", "reject", "envelope", "subaddress"];
if anyof ( header :comparator "i;octet" :contains "Subject" "***SPAM***", header :comparator "i;octet" :contains "X-Spam-Level" "***" ) {
fileinto "INBOX/Junk";
}
Rien de bien complexe au niveau de la syntaxe, ici le script va déposer dans le dossier junk du user les mails dont le sujet contient *SPAM* ou dont le level spam sera de 3 étoiles.
Pour créer vos propores script, le module ingo du webmail horde fonctionne très bien
Ensuite il suffit de compiler se script via la commande
/usr/lib/cyrus/bin/sievec antispam.script antispam.bc
Sievec fait partie du paquet cyrus-common
Le script, va rechercher la liste des tous les users, ensuite reprend le script actif du user, ajoute mes règles, recompile le tout et écrase le fichier actif du user
Voici mon script
#!/bin/bash # # Ce script parcour la liste des utilisateurs ayant un mail # test si le user a un dossier sieve (language de filtre pour mail) # test si règle de spam mise # si pas ajoute regle spam # jf 28/08/2009 #*********** # PARAMETERS #*********** commonscript="antispam.script" dossiersieve="/var/spool/sieve" cmdsievec="/usr/lib/cyrus/bin/sievec" filelog="result.log" nameln="defaultbc" mv ./$filelog ancien.log # #on sauvegarde les regles ! # export LC_ALL=fr_FR.UTF-8 today=`date '+%d-%m-%Y'` nomsave="save-rule-sieve-"$today".tgz" tar cfz $nomsave $dossiersieve >/dev/null 2>&1 #obtiens tous les logins dans staff ldapsearch -x -b ou=Users,ou=Empl,dc=domaine,dc=be -h ldap.mondomaine.be '' uid | grep ^uid: | sed 's/uid: //' > user_list ( # boucle pour chaque user dont l'uid est dans $f cat user_list | while read f; do echo "------------------------------------------"$f >> $filelog #ici commence a construire le chemin vers son dossier sieve # je recuper la premier lettre du login initial=`echo $f | cut -c1` rep=$dossiersieve"/"$initial"/"$f # si rep existe if [ -d $rep ] then #j obtiens le nom du fichier qui contient ses regles sieve cheminscript=$rep"/"$nameln nomscriptcompile=`readlink $cheminscript` # renomme l'extension du fichier nomscript=${nomscriptcompile%??}script fichier=$rep"/"$nomscript # test si ce fichier existe bien if [ -f $fichier ] then #test si user dispose de ma regle antispam nbrule=`grep -oc 'Antispam-Jf' -a $fichier` if [ $nbrule -ge 1 ] then echo 'Have already the anti-spam filter' >> $filelog else cat $commonscript > new.script #je retire le require du script, car j'en ai un dans mon script anti spam sed -e 's/require/\#require/g' $fichier >> new.script #cat $fichier >> new.script /usr/lib/cyrus/bin/sievec new.script new.bc >> $filelog #>/dev/null 2>&1 if [ -f ./new.bc ] then echo oki >> $filelog cp new.script $rep"/"$nomscript cp new.bc $rep"/"$nomscriptcompile rm ./new.bc rm ./new.script else echo "compilation foireuse" >> $filelog fi fi else echo 'Pas de fichier sieve'$fichier >> $filelog fi else echo 'Pas de dossier sieve' >> $filelog fi done ) 2>&1 | tee create_all_users.log
#antispam.script
# Antispam-Jf
require ["vacation", "regex", "imapflags", "fileinto", "reject", "envelope", "subaddress"];
if anyof ( header :comparator "i;octet" :contains "Subject" "***SPAM***", header :comparator "i;octet" :contains "X-Spam-Level" "***" ) {
fileinto "INBOX/Junk";
}
# Antivirus-Jf
if header :comparator "i;octet" :contains "Subject" "VIRUS-STOPPED" {
fileinto "INBOX/Junk";
}
Discussion