utils/sendmail, deconnexion.py et config/mails/upload.py : envoie de mail avec une classe pour instancier les messages

Idéalement, il faudrait passer tous les mails de la conf sous ce format et les instancier tous comme ça.
Ça permet d'encoder proprement les headers avec éventuellement des variables dedans.
This commit is contained in:
Vincent Le Gallic 2013-05-08 01:23:10 +02:00
parent 4dd12fa145
commit 20fdae6ac2
3 changed files with 37 additions and 49 deletions

View file

@ -3,6 +3,10 @@
from email.header import Header from email.header import Header
import sys
sys.path.append("/usr/scripts")
from utils.sendmail import Message
""" Templates des mails envoyés en cas d'upload. """ """ Templates des mails envoyés en cas d'upload. """
#: Envoyé à l'adhérent en cas de dépassement de la limite soft #: Envoyé à l'adhérent en cas de dépassement de la limite soft
@ -45,44 +49,6 @@ pas branchées sur le CRANS.
Disconnect team""" % {'subject': Header('[Cr@ns] Attention !', 'utf-8')} Disconnect team""" % {'subject': Header('[Cr@ns] Attention !', 'utf-8')}
class Message_adherent_soft(object):
template = u"""Bonjour %%(proprio)s,
Nous t'informons que ta (tes) machine(s) envoie(nt) une quantité
importante de données vers l'extérieur (%%(upload)s Mo en 24 heures).
*Ce message t'est envoyé à titre informatif, il ne te sanctionne pas.*
Il signifie que tu as envoyé plus de 300 Mo au cours des dernières 24
heures. Cela peut venir du fait que, *par exemple*, tu essaies
d'envoyer des fichiers de grosse taille à l'extérieur de la zone
crans, ou encore que tu as fait une utilisation importante de
logiciels envoyant une très grande quantité de petites données
(vidéo-conférence par exemple). Il peut y avoir d'autres raisons.
Si cela continuait, et que tu dépassais la limite acceptable des 3789
Mo sur 24 heures, ton débit serais automatiquement fortement limité pour
une durée de 24 heures. Il t'appartient donc de surveiller cela de
plus près et de faire en sorte que tes machines n'uploadent pas de
manière excessive à l'avenir.
Pour plus d'informations, tu peux consulter la page:
http://wiki.crans.org/VieCrans/DéconnexionPourUpload
Si tu as des questions, contacte disconnect@crans.org
N.B. : L'upload consiste en l'envoi de données vers des machines n'étant
pas branchées sur le CRANS.
--\u0020
Disconnect team"""
def __init__(self):
self.subject = u"[Cr@ns] Attention !"
#: Envoyé à l'adhérent en cas de dépassement de la limite hard #: Envoyé à l'adhérent en cas de dépassement de la limite hard
message_hard = u"""From: %%(from)s message_hard = u"""From: %%(from)s
To: %%(to)s To: %%(to)s
@ -121,13 +87,9 @@ Content-Type: text/plain; charset="utf-8"
--\u0020 --\u0020
Message créé par deconnexion.py""" Message créé par deconnexion.py"""
#: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard class Message_disconnect_hard(Message):
message_disconnect_hard = u"""From: %(from)s """Envoyé à la ML disconnect@ en cas de dépassement de la limite hard"""
To: %(to)s template = u"""%(proprio)s (%(id)s) a été limité en débit montant du fait d'un
Subject: %(proprio)s a =?utf-8?q?=C3=A9t=C3=A9_brid=C3=A9?=
Content-Type: text/plain; charset="utf-8"
%(proprio)s (%(id)s) a été limité en débit montant du fait d'un
upload excessif (%(upload)s Mo). upload excessif (%(upload)s Mo).
Ses machines ont été aperçues pour la dernière fois à ces endroits : Ses machines ont été aperçues pour la dernière fois à ces endroits :
@ -136,7 +98,16 @@ Ses machines ont été aperçues pour la dernière fois à ces endroits :
La chambre de l'adhérent est %(chambre)s. La chambre de l'adhérent est %(chambre)s.
--\u0020 --\u0020
Message créé par deconnexion.py""" Message créé par deconnexion.py
""" + (" __1__"+10*" "+3*"%"+","+7*"%"+"\n \_._/"+11*" "+",'%% \\-*"+7*"%"+"\n ( ^ )"+5*" "+";"+5*"%"+"*% _%%%%\"\n"+2*" "+"`='|\."+4*" "+",%%%"+7*" "+"\(_.*%%%%.\n"+4*" "+"/ |"+4*" "+"% *%%, ,"+4*"%"+"*("+4*" "+"'\n (/ | %^"+5*" "+",*%%% )\|,%%*%,_\n |__, |"+7*" "+"*%"+4*" "+"\/ #).-\"*%%*\n | |"+11*" "+"_.) ,/ *%,\n | | "+9*"_"+"/)#("+12*"_"+"\n /___| |"+25*"_"+"|\n ===").replace("%", "%%")
def __init__(self, emetteur, destinataires, proprio, id, upload, mdc, chambre):
self.proprio = proprio
self.id, self.upload, self.mdc, self.chambre = id, upload, mdc, chambre
self.objet = u"%s a été bridé" % (proprio)
self.corps = self.template
super(Message_disconnect_hard, self).__init__(emetteur, destinataires, self.objet, self.corps)
#: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard plusieurs fois #: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard plusieurs fois
message_disconnect_multi = u"""From: %(from)s message_disconnect_multi = u"""From: %(from)s

View file

@ -258,9 +258,8 @@ for elupload, eltype, elid in uploadeurs:
theid = "cid=" theid = "cid="
else: else:
theid = "aid=" theid = "aid="
corps = config.mails.upload.message_disconnect_hard % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom(), 'mdc': mdcf, 'chambre': proprio.chbre(), 'id': theid + proprio.id()} mail = config.mails.upload.Message_disconnect_hard(upload.expediteur, upload.expediteur, proprio=proprio.Nom(), id=theid + proprio.id(), upload=elupload, mdc=mdcf, chambre=proprio.chbre())
corps = corps.encode('utf-8') mail.send()
mail.sendmail(upload.expediteur, upload.expediteur, corps)
# Vérification du nombre de déconnexions # Vérification du nombre de déconnexions
######################################### #########################################

View file

@ -43,6 +43,24 @@ def sendmail(emetteur, destinataires, objet, message, cc=[], more_headers={}, de
mail = create_mail(emetteur, destinataires, objet, message, cc, more_headers) mail = create_mail(emetteur, destinataires, objet, message, cc, more_headers)
actually_sendmail(emetteur, destinataires, mail, debug) actually_sendmail(emetteur, destinataires, mail, debug)
class Message(object):
"""Message pré-formaté à envoyer à un adhérent ou une ML"""
def __init__(self, emetteur, destinataires, objet, corps, cc=[], more_headers={}):
self.emetteur = emetteur
self.destinataires = destinataires
self.objet = objet
self.cc = cc
self.more_headers = more_headers
self.corps = corps % self.__dict__
def mail(self):
"""Fabrique le mail"""
return create_mail(self.emetteur, self.destinataires, self.objet,
self.corps, self.cc, self.more_headers)
def send(self):
"""Envoie le mail"""
return actually_sendmail(self.emetteur, self.destinataires, self.mail())
if __name__ == "__main__": if __name__ == "__main__":
print "Exemple d'utilisation :" print "Exemple d'utilisation :"