Commit 1bcc9624 by Tu Nombre

se agrega limite de envio y excepciones de dominios argentinos como nic.ar

1 parent c0e4da59
...@@ -23,6 +23,8 @@ PaisDom = ("ac","ad","ae","af","ag","ai","al","am","ao","aq","ar","as","at","au" ...@@ -23,6 +23,8 @@ PaisDom = ("ac","ad","ae","af","ag","ai","al","am","ao","aq","ar","as","at","au"
"ss","st","su","sv","sx","sy","sz","tc","td","tf","tg","th","tj","tk","tl","tm","tn","to","tr","tt","tv","tw","tz","ua","ug","uk","us","uy","uz","va","vc","ve","vg","vi", "ss","st","su","sv","sx","sy","sz","tc","td","tf","tg","th","tj","tk","tl","tm","tn","to","tr","tt","tv","tw","tz","ua","ug","uk","us","uy","uz","va","vc","ve","vg","vi",
"vn","vu","wf","ws","ye","yt","za","zm","zw") "vn","vu","wf","ws","ye","yt","za","zm","zw")
Ecepciones = ("gov.ar", "gob.ar", "edu.ar", "mil.ar", "nic.ar")
class ValidacionCorreo(): class ValidacionCorreo():
"""clase para revisar que los mails tengan los requisitos minimos para tratar de envia""" """clase para revisar que los mails tengan los requisitos minimos para tratar de envia"""
def ValidarCorreo(self, correo): def ValidarCorreo(self, correo):
...@@ -50,8 +52,10 @@ class ValidacionCorreo(): ...@@ -50,8 +52,10 @@ class ValidacionCorreo():
def validacionDominio(self, dominio): def validacionDominio(self, dominio):
"""si es un dominio valido, devuelve true sino false""" """si es un dominio valido, devuelve true sino false"""
d = dominio.split(".") d = dominio.split(".")
if d[-2]+d[-1] in Ecepciones:#Ecepcion a la validacion
return(True)
error = True error = True
if len(d) > 3: if len(d) > 3:#esta revision esta mal hay que repensarla
error = False error = False
if 2 > len(d): if 2 > len(d):
error = False error = False
......
...@@ -43,12 +43,92 @@ class StatePhoneWs(): ...@@ -43,12 +43,92 @@ class StatePhoneWs():
class StateMail(): class StateMail():
"""Esta clase consulta el estado de los mail server y los cachea """Esta clase consulta el estado de los mail server y los cachea
la consulta tiene 60 segundos de valides, para mejorar la perfrmance""" la consulta tiene 60 segundos de valides, para mejorar la perfrmance
y la cantidad de mails enviado por dia para no superar el limite de emision"""
def __init__(self): def __init__(self):
self.Consultas = {}#{MailUSer-pass-host-str(port):{"hora": datetime.datetime.now, "estado": self.chequear_stado_WB(telefono)},} self.Consultas = {}#{MailUSer-pass-host-str(port):{"hora": datetime.datetime.now, "estado": self.chequear_stado_WB(telefono)},}
self.MailRompedor = [] self.MailRompedor = []
self.MailEnviado = {} self.MailsEnviado = {}#"MAIL@HOST": n
self.MailsBloqueados = {}#"MAIL@HOST": datetimeDeDesbloqueo
def ChequearCuentaBlockeadaYEnviar(self, mail, smtphost):
"""Chequeo la cuenta para ver si esta llegando al limite de bloqueo
o si ya paso suficiente tiempo para volver a usarla"""
if False == self.CuentaBloqueada(mail):
return(False)
limite = self.MailEnviado(mail, smtphost)
if limite == False:
self.BloquearCuenta(mail)
return(limite)
def BloquearCuenta(self, mail):
"""Bloquea cuenta por un dia"""
tiempo = datetime.datetime.now() + datetime.timedelta(days=1)
self.MailsBloqueados[mail] = tiempo
self.MailsEnviado[mail] = []
return(True)
def CuentaBloqueada(self, mail):
"""si la cuenta esta bloqueada devuelve False
sino True.
Si esta bloqueada y paso el dia la desbloquea y devuelve True"""
try:
Fecha = self.MailsBloqueados[mail]
except:
return(True)#Si no esta en la lissta de bloqueados devuelvo True
if Fecha < datetime.datetime.now():#si paso el dia
self.MailsBloqueados.pop(mail, None)#Remuevo el mail de los bloqueados
return(True)
return(False)
def MailEnviado(self, mail, smtphost):
habilitado = True
if self._sumarMail(mail) > self.ArmarListadoLimitesHost(smtphost):
habilitado = False
return(habilitado)
def _sumarMail(self, mail):
"""Se agrega al dicionario si no existe si existe se le agrega
devuelve el resultado"""
try:
self.MailsEnviado[mail].append(datetime.datetime.now())
except:
self.MailsEnviado[mail] = []
self.MailsEnviado[mail].append(datetime.datetime.now())
#print("linea 94", self.MailsEnviado[mail])
LOG = []
for MAIL in self.MailsEnviado[mail]:
#print("linea 97", MAIL)
#print("linea 98", MAIL, datetime.datetime.now() + datetime.timedelta(days=1))
if MAIL < datetime.datetime.now() + datetime.timedelta(days=1):
LOG.append(MAIL)
self.MailsEnviado[mail] = LOG
#try:
# self.MailsEnviado[mail] = self.MailsEnviado[mail] + 1
#except:
# self.MailsEnviado[mail] = 0
resultado = len(self.MailsEnviado[mail])
print(resultado)
return(resultado)
def LimpiarListaMailEnviados(self):
self.MailsEnviado = {}
return("True")
def ArmarListadoLimitesHost(self, host):
"""Devuelve la cantidad de mails que se puede enviar diariamente
La lista de donde se toma esta informacion esta en un json
Mira la configuracion"""
with open(config.ArchivoLimitesHosts) as json_file:
data = json.load(json_file)
try:
n = data[host]
except:
n = config.LimiteDiario
return(n)
def chequear_stado_Server(self, User, Pass, Port, Host): def chequear_stado_Server(self, User, Pass, Port, Host):
try: try:
......
...@@ -10,3 +10,6 @@ SMTP_PORT = 587 ...@@ -10,3 +10,6 @@ SMTP_PORT = 587
SMS_URL = "http://192.168.15.120:8080/v1/sms/send/" SMS_URL = "http://192.168.15.120:8080/v1/sms/send/"
folder = "msg/" folder = "msg/"
db = "/dev/shm/messages.db" db = "/dev/shm/messages.db"
TimeQueqe = 30
LimiteDiario = 200
ArchivoLimitesHosts = "limites.json"
\ No newline at end of file \ No newline at end of file
from services import serviceFactory from services import serviceFactory
from database import DBconnection from database import DBconnection
from enums import Services, States, Datatypes, Table from enums import Services, States, Datatypes, Table
import ipdb, os, json, datetime import ipdb, os, json, datetime, config
class Process: class Process:
...@@ -64,7 +64,7 @@ class Process: ...@@ -64,7 +64,7 @@ class Process:
self.stateMail.MailRompedor = [] self.stateMail.MailRompedor = []
def _send(self,state,serv): def _send(self,state,serv):
fin = datetime.datetime.now() + datetime.timedelta(seconds=15) fin = datetime.datetime.now() + datetime.timedelta(seconds=config.TimeQueqe)
rows = self.conn.query("SELECT * FROM msg WHERE state = ? and serv = ? ",(state,serv)) rows = self.conn.query("SELECT * FROM msg WHERE state = ? and serv = ? ",(state,serv))
if not len(rows) == 0: if not len(rows) == 0:
print("cantidad pendiente ", serv, len(rows)) print("cantidad pendiente ", serv, len(rows))
......
...@@ -238,6 +238,10 @@ class Mail(ServiceBase): ...@@ -238,6 +238,10 @@ class Mail(ServiceBase):
Host=smtp["host"]) Host=smtp["host"])
if est == False: if est == False:
raise NameError("Mail_Server_Fall") raise NameError("Mail_Server_Fall")
#Ahora Probamos si no supero el limite de envios
lim = stadomail.ChequearCuentaBlockeadaYEnviar(smtp["username"], smtp["host"])
if lim == False:
raise NameError("Cuenta_Mail_Prebloqueda")
def SMTPcliente(self,msg, Serversmtp): def SMTPcliente(self,msg, Serversmtp):
print("mail sale por cliente") print("mail sale por cliente")
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!