From 7fc616ab3a2eee1333440798cafca8b708e8e2d4 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Mon, 2 Nov 2020 00:58:02 -0300 Subject: [PATCH] Trabajadores de emails --- src/email/__init__.py | 2 + src/email/email_interpreter.py | 10 ++++ src/email/revisor_worker.py | 90 ++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 src/email/__init__.py create mode 100644 src/email/email_interpreter.py create mode 100644 src/email/revisor_worker.py diff --git a/src/email/__init__.py b/src/email/__init__.py new file mode 100644 index 0000000..31bb193 --- /dev/null +++ b/src/email/__init__.py @@ -0,0 +1,2 @@ +from .email_interpreter import EmailInterpreter +from .revisor_worker import RevisorEmailWorker diff --git a/src/email/email_interpreter.py b/src/email/email_interpreter.py new file mode 100644 index 0000000..6c0002f --- /dev/null +++ b/src/email/email_interpreter.py @@ -0,0 +1,10 @@ +from threading import Thread + + +class EmailInterpreter(Thread): + def __init__(self, configs, params): + super().__init__() + self.logging = params['logging'] + + def run(self): + self.logging.log('Starting', type(self)) diff --git a/src/email/revisor_worker.py b/src/email/revisor_worker.py new file mode 100644 index 0000000..f6e3088 --- /dev/null +++ b/src/email/revisor_worker.py @@ -0,0 +1,90 @@ +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