91 lines
3.7 KiB
Python
91 lines
3.7 KiB
Python
from threading import Thread
|
|
import re
|
|
import time
|
|
import email.utils
|
|
from bs4 import BeautifulSoup
|
|
from entry.email.inbox import connect, check_inbox
|
|
from src.text.message import Message
|
|
|
|
|
|
class RevisorEmailWorker(Thread):
|
|
def __init__(self, configs, params):
|
|
super().__init__()
|
|
self._url = configs.get('email.imap_server')
|
|
self._port = configs.get('email.port')
|
|
self._username = configs.get('email.username')
|
|
self._password = configs.get('email.password')
|
|
self._ssl = configs.get('email.ssl')
|
|
self.queue = params['queues']['emails']
|
|
self.questions = params['queues']['questions']
|
|
self.event = params['events']['stop']
|
|
self._wait = configs.get('supervisor.wait')
|
|
self._bosses = params['bosses']
|
|
self._logger = params['queues']['log']
|
|
self.logging = params['logging']
|
|
self.revisados = []
|
|
|
|
def revisado(self, uid):
|
|
if not self.check_revisado(uid):
|
|
self.revisados.append(uid)
|
|
|
|
def check_revisado(self, uid):
|
|
if uid in self.revisados:
|
|
return True
|
|
return False
|
|
|
|
def run(self):
|
|
self.logging.log('Starting', type(self))
|
|
self._logger.put({'action': 'Inicio jornada trabajador Revisor Email'})
|
|
while not self.event.is_set():
|
|
self.logging.log('Looping status {0}'.format(not self.event.is_set()), type(self))
|
|
self.logging.log('Connecting to Email Server', type(self))
|
|
imap = connect(imap_url=self._url, port=self._port, username=self._username, password=self._password,
|
|
ssl=self._ssl)
|
|
self.logging.log('Getting emails', type(self))
|
|
emails = check_inbox(imap)
|
|
if emails is not None:
|
|
c = 0
|
|
p = 0
|
|
for em in emails:
|
|
if self.check_revisado(em.uid):
|
|
continue
|
|
sender = em.message['from']
|
|
text = ' '.join([em.message['subject'] + '.'] + self.build_message(em.message))
|
|
msg = Message('email', text=text, original=em, sender=sender,
|
|
datetime=email.utils.parsedate_to_datetime(em.message['Date']))
|
|
if not self._bosses.is_boss(sender):
|
|
self.logging.log('Sender {0} is not a boss'.format(sender), type(self))
|
|
self.revisado(em.uid)
|
|
self.questions.put(msg)
|
|
p += 1
|
|
continue
|
|
self.queue.put(msg)
|
|
self.revisado(em.uid)
|
|
c += 1
|
|
self.logging.log('{0} emails checked'.format(c), type(self))
|
|
if c > 0:
|
|
self._logger.put({'action': 'Revise {0} nuevos correos'.format(c)})
|
|
self.logging.log('{0} emails pending'.format(p), type(self))
|
|
if p > 0:
|
|
self._logger.put({'action': 'Tengo dudas en {0} correos'.format(p)})
|
|
imap.close()
|
|
time.sleep(self._wait)
|
|
self.logging.log('Exiting', type(self))
|
|
return
|
|
|
|
def build_message(self, email_part):
|
|
output = []
|
|
if email_part.is_multipart():
|
|
for part in email_part.get_payload():
|
|
output.append(self.build_message(part))
|
|
else:
|
|
html = email_part.get_payload(decode=True)
|
|
bs = BeautifulSoup(html, 'html.parser')
|
|
if bs.body:
|
|
html = bs.body.get_text()
|
|
else:
|
|
html = bs.get_text()
|
|
html = re.sub(' +', ' ', re.sub("\n+", ' ', html)).strip(' ')
|
|
output.append(html)
|
|
return output
|