"""Parse gmail account for control codes.""" import email import imaplib from integration_scripts import logger from integration_scripts.constants.service import CONTROL_CODE, SENDER_USERNAME def control_from_gmail(process_name, smtp_server, email_address, password): """Check gail for a message witha given subject for control codes.""" try: mail = imaplib.IMAP4_SSL(smtp_server) mail.login(email_address, password) mail.select('inbox') type, data = mail.search(None, 'ALL') mail_ids = data[0] id_list = mail_ids.split() # first_email_id = int(id_list[0]) if id_list: latest_email_id = int(id_list[-1]) else: return typ, data = mail.fetch(str(latest_email_id), '(RFC822)') for response_part in data: if isinstance(response_part, tuple): msg = email.message_from_bytes(response_part[1]) email_subject = msg['subject'] email_from = msg['from'] controls = email_subject.split('::') if CONTROL_CODE in email_subject \ and SENDER_USERNAME in email_from: if controls[2] == 'all' or controls[2] == process_name: return_val = controls[3] mail.store(str(latest_email_id), '+FLAGS', '\\Deleted') return return_val except Exception as e: return 'Error checking email:\n{}'.format(str(e)) return None def process_control_email(name, smtp_server, email_login, email_pwd): """Process control emails to start or stop the system""" # *** DISABLED - Too risky/potentially slow # Turn off if email control received. control = control_from_gmail(name, smtp_server, email_login, email_pwd) if control == 'off': logger.info('Terminating process {} from remote email control.', name) raise InterruptedError('Process received interrupt signal.') elif control: logger.info('Non-terminal remote email control message ' 'received. \n{}', control)