[config_mail] Ajout du dossier pour déplacer les spams
This commit is contained in:
parent
21fc3e42d6
commit
a2d0eaf5ea
1 changed files with 117 additions and 25 deletions
|
@ -30,10 +30,10 @@
|
||||||
"""
|
"""
|
||||||
Script permetant de gérer sa configuration mail
|
Script permetant de gérer sa configuration mail
|
||||||
|
|
||||||
Usage : ConfigMail.py [--forward=(|<mail>)] [--spam=(accepte|marque|supprime)]
|
Usage : ConfigMail.py [--forward=(|<mail>)] [--spam=(accepte|marque|deplace|supprime)]
|
||||||
Retourne :
|
Retourne :
|
||||||
forward=(|<mail>)
|
forward=(|<mail>)
|
||||||
spam=(accepte|marque|supprime)
|
spam=(accepte|marque|deplace|supprime)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
procmail_warning = """################################################################
|
procmail_warning = """################################################################
|
||||||
|
@ -46,6 +46,24 @@ procmail_warning = """##########################################################
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Pour éviter des crash
|
||||||
|
procmail_mark_old = """# Passage des mails dans spamassassin
|
||||||
|
:0 Whbf
|
||||||
|
* < 256000
|
||||||
|
| spamc
|
||||||
|
|
||||||
|
# Serveur blacklisté
|
||||||
|
:0
|
||||||
|
* ^X-Reject: 554
|
||||||
|
* !^X-Spam-Status: Yes
|
||||||
|
{
|
||||||
|
:0 Whf
|
||||||
|
* ^Subject:\/.*
|
||||||
|
| formail -i "Subject: *****SPAM***** $MATCH"
|
||||||
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
procmail_mark = """# Passage des mails dans spamassassin
|
procmail_mark = """# Passage des mails dans spamassassin
|
||||||
:0 Whbf
|
:0 Whbf
|
||||||
* < 256000
|
* < 256000
|
||||||
|
@ -61,13 +79,37 @@ procmail_mark = """# Passage des mails dans spamassassin
|
||||||
| formail -i "Subject: *****SPAM***** $MATCH"
|
| formail -i "Subject: *****SPAM***** $MATCH"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:0
|
||||||
|
* ^X-Spam-Status: Yes
|
||||||
|
{
|
||||||
|
:0 Whf
|
||||||
|
* ^Subject:\/.*
|
||||||
|
| formail -i "Subject: *****SPAM***** $MATCH"
|
||||||
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
procmail_delete_spam = """# Suppression des spams
|
procmail_delete_spam = """# Suppression des spams
|
||||||
:0 Whf
|
:0 Whf
|
||||||
* ^Subject: *****SPAM*****
|
* ^Subject: *****SPAM*****
|
||||||
/dev/null
|
/dev/null
|
||||||
|
"""
|
||||||
|
|
||||||
|
procmail_move = """#Déplacement des spams
|
||||||
|
:0 Whbf
|
||||||
|
* < 256000
|
||||||
|
| spamc
|
||||||
|
|
||||||
|
# Serveur blacklisté
|
||||||
|
:0
|
||||||
|
* ^X-Reject: 554
|
||||||
|
* !^X-Spam-Status: Yes
|
||||||
|
.%(spamdir)s
|
||||||
|
|
||||||
|
# Mail de spam
|
||||||
|
:0
|
||||||
|
* ^X-Spam-Status: Yes
|
||||||
|
.%(spamdir)s
|
||||||
"""
|
"""
|
||||||
|
|
||||||
procmail_forward = """# Redirection des mails
|
procmail_forward = """# Redirection des mails
|
||||||
|
@ -82,13 +124,20 @@ forward_procmail = '"|exec /usr/bin/procmail"\n'
|
||||||
|
|
||||||
|
|
||||||
from commands import getstatusoutput
|
from commands import getstatusoutput
|
||||||
import os, sys, pwd, getopt
|
import os
|
||||||
|
import sys
|
||||||
|
import pwd
|
||||||
|
import getopt
|
||||||
home = pwd.getpwuid(os.getuid())[5]
|
home = pwd.getpwuid(os.getuid())[5]
|
||||||
import re
|
import re
|
||||||
|
|
||||||
class MailConfigError(ReferenceError):
|
class MailConfigError(ReferenceError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def Log(content):
|
||||||
|
with open('/tmp/intranet.log', 'a') as log:
|
||||||
|
log.writelines(content+"\n")
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
## Fonctions utiles
|
## Fonctions utiles
|
||||||
|
|
||||||
|
@ -118,11 +167,11 @@ def _GetConfig():
|
||||||
raise MailConfigError, 'Fichier forward trop long'
|
raise MailConfigError, 'Fichier forward trop long'
|
||||||
fic_forward = fic_forward[0]
|
fic_forward = fic_forward[0]
|
||||||
except IOError:
|
except IOError:
|
||||||
return {'forward':'', 'spam':'accepte'}
|
return {'forward':'', 'spam':'accepte', 'spamdir':None}
|
||||||
|
|
||||||
# forward simple
|
# forward simple
|
||||||
if _IsMail(fic_forward):
|
if _IsMail(fic_forward):
|
||||||
return {'forward':fic_forward, 'spam':'accepte'}
|
return {'forward':fic_forward, 'spam':'accepte', 'spamdir':None}
|
||||||
|
|
||||||
# utilisation de procmail
|
# utilisation de procmail
|
||||||
if fic_forward != _Clean(forward_procmail)[0]:
|
if fic_forward != _Clean(forward_procmail)[0]:
|
||||||
|
@ -140,27 +189,41 @@ def _GetConfig():
|
||||||
|
|
||||||
# forward simple dans le procmailrc
|
# forward simple dans le procmailrc
|
||||||
if not fic_procmail:
|
if not fic_procmail:
|
||||||
return {'forward':forward, 'spam':'accepte'}
|
return {'forward':forward, 'spam':'accepte', 'spamdir':None}
|
||||||
|
|
||||||
# marquage des spams
|
# marquage des spams
|
||||||
tmp = _Clean( procmail_mark )
|
tmp = _Clean( procmail_mark )
|
||||||
if fic_procmail[:len(tmp)] != tmp:
|
tmp2 = _Clean( procmail_move )
|
||||||
raise MailConfigError, 'Fichier de procmail non compréhensible'
|
tmp3 = _Clean( procmail_mark_old )
|
||||||
fic_procmail = fic_procmail[len(tmp):]
|
mark = False
|
||||||
|
move = False
|
||||||
|
if fic_procmail[:len(tmp)] != tmp and fic_procmail[:len(tmp)] != tmp3:
|
||||||
|
if len(fic_procmail) != len(tmp2):
|
||||||
|
raise MailConfigError, 'Fichier de procmail non compréhensible'
|
||||||
|
else:
|
||||||
|
spamdir = fic_procmail[-1][1:]
|
||||||
|
fic_procmail = fic_procmail[len(tmp2):]
|
||||||
|
move = True
|
||||||
|
else:
|
||||||
|
fic_procmail = fic_procmail[len(tmp):]
|
||||||
|
spamdir = ""
|
||||||
|
mark = True
|
||||||
|
|
||||||
# suppression des spams ?
|
# suppression des spams ?
|
||||||
if not fic_procmail:
|
if (not fic_procmail) and mark:
|
||||||
return {'forward':forward, 'spam':'marque'}
|
return {'forward':forward, 'spam':'marque', 'spamdir':None}
|
||||||
|
elif (not fic_procmail) and move:
|
||||||
|
return {'forward':forward, 'spam':'deplace', 'spamdir':spamdir}
|
||||||
elif fic_procmail == _Clean(procmail_delete_spam):
|
elif fic_procmail == _Clean(procmail_delete_spam):
|
||||||
return {'forward':forward, 'spam':'supprime'}
|
return {'forward':forward, 'spam':'supprime', 'spamdir':None}
|
||||||
else:
|
else:
|
||||||
raise MailConfigError, 'Fichier de procmail non compréhensible'
|
raise MailConfigError, 'Fichier de procmail non compréhensible'
|
||||||
|
|
||||||
def _SetConfig(forward = None, spam= None):
|
def _SetConfig(forward = None, spam= None, spamdir=None):
|
||||||
""" Modifie la configuration de l'utilisateur courant """
|
""" Modifie la configuration de l'utilisateur courant """
|
||||||
|
|
||||||
# variable new_spam
|
# variable new_spam
|
||||||
if spam in ['accepte','supprime','marque']:
|
if spam in ['accepte', 'deplace', 'supprime','marque']:
|
||||||
new_spam = spam
|
new_spam = spam
|
||||||
elif spam == None:
|
elif spam == None:
|
||||||
new_spam = _GetConfig()['spam']
|
new_spam = _GetConfig()['spam']
|
||||||
|
@ -175,6 +238,14 @@ def _SetConfig(forward = None, spam= None):
|
||||||
else:
|
else:
|
||||||
raise ValueError, 'Adresse mail invalide'
|
raise ValueError, 'Adresse mail invalide'
|
||||||
|
|
||||||
|
if spamdir == None:
|
||||||
|
new_spamdir = _GetConfig()['spamdir']
|
||||||
|
elif re.match('^[a-zA-Z0-9_-]+$', spamdir):
|
||||||
|
new_spamdir = spamdir
|
||||||
|
else:
|
||||||
|
raise ValueError, 'Nom de dossier invalide'
|
||||||
|
|
||||||
|
|
||||||
# génération des fichiers
|
# génération des fichiers
|
||||||
if new_spam=='accepte':
|
if new_spam=='accepte':
|
||||||
# suppression du .procmailrc
|
# suppression du .procmailrc
|
||||||
|
@ -189,16 +260,19 @@ def _SetConfig(forward = None, spam= None):
|
||||||
os.remove('%s/.forward'%home)
|
os.remove('%s/.forward'%home)
|
||||||
else:
|
else:
|
||||||
# écriture du .procmailc
|
# écriture du .procmailc
|
||||||
txt = procmail_warning + procmail_mark
|
if new_spam == 'marque':
|
||||||
|
txt = procmail_warning + procmail_mark
|
||||||
if new_spam=='supprime':
|
if new_spam=='supprime':
|
||||||
txt += procmail_delete_spam
|
txt = procmail_warning + procmail_mark + procmail_delete_spam
|
||||||
|
if new_spam == 'deplace':
|
||||||
|
txt = procmail_warning + procmail_move % ({'spamdir':new_spamdir})
|
||||||
if new_forward:
|
if new_forward:
|
||||||
txt += procmail_forward % new_forward
|
txt += procmail_forward % new_forward
|
||||||
open('%s/.procmailrc'%home,'w').write(txt)
|
open('%s/.procmailrc'%home,'w').write(txt)
|
||||||
# écriture du .forward
|
# écriture du .forward
|
||||||
open('%s/.forward'%home,'w').write(forward_procmail)
|
open('%s/.forward'%home,'w').write(forward_procmail)
|
||||||
|
|
||||||
def _Sudo(uid, forward=None, spam=None):
|
def _Sudo(uid, forward=None, spam=None, spamdir=None):
|
||||||
""" Execute le script pour un autre utilisateur """
|
""" Execute le script pour un autre utilisateur """
|
||||||
# construction de la ligne de commande
|
# construction de la ligne de commande
|
||||||
if __file__[-4:]=='.pyc':
|
if __file__[-4:]=='.pyc':
|
||||||
|
@ -210,6 +284,8 @@ def _Sudo(uid, forward=None, spam=None):
|
||||||
c += " --forward=%s" % forward
|
c += " --forward=%s" % forward
|
||||||
if spam!=None:
|
if spam!=None:
|
||||||
c += " --spam=%s" % spam
|
c += " --spam=%s" % spam
|
||||||
|
if spamdir!=None:
|
||||||
|
c += " --spamdir=%s" %spamdir
|
||||||
|
|
||||||
# execution de la commande
|
# execution de la commande
|
||||||
status, output = getstatusoutput(c)
|
status, output = getstatusoutput(c)
|
||||||
|
@ -231,21 +307,22 @@ def _Sudo(uid, forward=None, spam=None):
|
||||||
##
|
##
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
def MailConfig(uid=None, forward=None, spam=None):
|
def MailConfig(uid=None, forward=None, spam=None, spamdir=None):
|
||||||
""" Modifie ou retourne la configuration mail de l'utilisateur
|
""" Modifie ou retourne la configuration mail de l'utilisateur
|
||||||
|
|
||||||
user = utilisateur à configurer, si None configure l'utilisateur courant
|
user = utilisateur à configurer, si None configure l'utilisateur courant
|
||||||
forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection
|
forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection
|
||||||
spam = action à effectuer sur les spams (accepte, supprime, marque)
|
spam = action à effectuer sur les spams (accepte, supprime, marque)
|
||||||
|
spamdir = dossier où déplacer le spam.
|
||||||
|
|
||||||
Pour les champs forward et spam, la valeur None ne touche pas au champ.
|
Pour les champs forward et spam, la valeur None ne touche pas au champ.
|
||||||
|
|
||||||
Retourne un dictionnaire { 'forward':'', 'spam':'' }
|
Retourne un dictionnaire { 'forward':'', 'spam':'', 'spamdir:''}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
## demande pour un autre utilisateur
|
## demande pour un autre utilisateur
|
||||||
if uid:
|
if uid:
|
||||||
return _Sudo(uid=uid, forward=forward, spam=spam)
|
return _Sudo(uid=uid, forward=forward, spam=spam, spamdir=spamdir)
|
||||||
|
|
||||||
## nettoyage des variables
|
## nettoyage des variables
|
||||||
cfg = _GetConfig()
|
cfg = _GetConfig()
|
||||||
|
@ -253,10 +330,14 @@ def MailConfig(uid=None, forward=None, spam=None):
|
||||||
forward = None
|
forward = None
|
||||||
if spam == cfg['spam']:
|
if spam == cfg['spam']:
|
||||||
spam = None
|
spam = None
|
||||||
|
if spamdir == cfg['spamdir']:
|
||||||
|
spamdir = None
|
||||||
|
if spamdir == "":
|
||||||
|
spamdir = None
|
||||||
|
|
||||||
## modifications
|
## modifications
|
||||||
if forward!=None or spam!=None:
|
if forward != None or spam != None or spamdir != None:
|
||||||
_SetConfig(forward=forward, spam=spam)
|
_SetConfig(forward=forward, spam=spam, spamdir=spamdir)
|
||||||
|
|
||||||
## on renvoie la configuration
|
## on renvoie la configuration
|
||||||
return _GetConfig()
|
return _GetConfig()
|
||||||
|
@ -265,15 +346,26 @@ if __name__=="__main__":
|
||||||
## parsage des arguments
|
## parsage des arguments
|
||||||
forward = None
|
forward = None
|
||||||
spam = None
|
spam = None
|
||||||
opts, args = getopt.getopt(sys.argv[1:], "", ['forward=', 'spam='])
|
spamdir = None
|
||||||
|
opts, args = getopt.getopt(sys.argv[1:], "", ['forward=', 'spam=', 'spamdir='])
|
||||||
|
if ('--spam','deplace') in opts:
|
||||||
|
optgood = False
|
||||||
|
for o, v in opts:
|
||||||
|
if o == '--spamdir':
|
||||||
|
optgood = True
|
||||||
|
if not optgood:
|
||||||
|
raise ValueError, 'Il faut renseigner un dossier pour déplacer le spam'
|
||||||
for o, v in opts:
|
for o, v in opts:
|
||||||
if o == "--forward":
|
if o == "--forward":
|
||||||
forward = v
|
forward = v
|
||||||
elif o == '--spam':
|
elif o == '--spam':
|
||||||
spam = v
|
spam = v
|
||||||
|
elif o == '--spamdir':
|
||||||
|
spamdir = v
|
||||||
|
|
||||||
|
|
||||||
## execution de MailConfig
|
## execution de MailConfig
|
||||||
res = MailConfig(forward=forward, spam=spam)
|
res = MailConfig(forward=forward, spam=spam, spamdir=spamdir)
|
||||||
|
|
||||||
## affichage des résultats
|
## affichage des résultats
|
||||||
for i in res.items():
|
for i in res.items():
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue