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