def message_user(self, reddit_user, subject, message, sender_email): # TODO: CREATE MODULE TO ENCAPSULATE REDDIT FUNCTIONALITY """ SEND A REDDIT USER A MESSAGE :param reddit: REDDIT INSTANCE :param reddit_user: USERS NAME (STR) :param subject: MESSAGE SUBJECT (STR) :param message: MESSAGE TO SEND (STR) :return: """ try: self.reddit_conn.redditor(reddit_user).message(subject, message) except Exception: logger.critical('----------Error encountered----------') tb = traceback.format_exc() logger.critical(tb) logger.critical('-------------------------------------') return False message = Messages(sender=sender_email, recipient=reddit_user, body=message, subject=subject, date_sent=datetime.datetime.now(), has_been_sent_for_processing=0, ca_user_id_assoc='parent') Messages.add_record(message) db.session.commit() return True
def run(self): """ :return: """ logger.info("ENTERED EMAIL INBOX SCRAPER") while True: # CONNECT TO EMAIL SERVER try: # TRY TO LOGIN self.server = imaplib.IMAP4_SSL(self.imap_ssl_host, self.imap_ssl_port) self.server.login(self.username, self.password) except Exception: logger.critical( "FAILED TO LOGIN TO EMAIL SERVER. KILLING THREAD") # exit(1) self.server.select('INBOX') (retcode, messages) = self.server.search(None, '(UNSEEN)') if retcode == 'OK': for num in messages[0].split(): typ, data = self.server.fetch(num, '(RFC822)') for response_part in data: if isinstance(response_part, tuple): message = email.message_from_bytes( response_part[1]) _from = message['Reply-to'] _subject = message['Subject'] if 're' in _subject.lower(): _subject = re.split("Re:", _subject)[1].strip() _subject = json.loads(_subject) mesage_id = _subject['message_id'] # EXTRACT REDDIT USERNAME reddit_user = _subject['username'] body = EmailReader.get_first_text_block(message) try: # MESSAGE HAS A SIGNATURE, ALSO A POSSIBLE REPLY W SIGNATURE body_without_signature = body.split( "=E2=80=94")[1] except IndexError: # MESSAGE IS A REPLY body_without_signature = body.split( "=EF=BB=BF")[0] # parent_message = Messages.query.filter_by( # recipient=reddit_user).filter_by( # ca_user_id_assoc='parent').first() self.reddit.reddit_conn.inbox.message( mesage_id).reply(body_without_signature) self.server.store(num, '+FLAGS', '\\Seen') message = Messages( sender=_from, recipient=reddit_user, subject=_subject['subject'], body=body_without_signature, date_sent=datetime.datetime.now(), has_been_sent_for_processing=1, ca_user_id_assoc=mesage_id) Messages.add_record(message) db.session.commit() self.server.logout() # logger.info("NOTHING NEW IN EMAIL INBOX--SLEEPING") time.sleep(20)
def reply_checker(self): """ METHOD THAT CONSTANTLY CHECKS FOR NEW MESSAGES IN REDDIT INBOX :return: """ logger.info("ENTERED REDDIT INBOX SCRAPER") while True: try: # TODO: CHANGE TO STREAM FOR PROD # PULL REDDIT INBOX STREAM new_reddit_messages = self.reddit.reddit_conn.inbox.unread() # LOOP THROUGH REDDIT MESSAGES for message in new_reddit_messages: # GET REDDIT USERNAME / ID OF NEW MESSAGE reddit_username_of_new_message = message.author.name message_id = message.id # CHECK TO SEE IF MESSAGE IS ALREADY IN MESSAGE QUEUE message_exists = Messages.query.filter_by( recipient=reddit_username_of_new_message).filter_by( ca_user_id_assoc=message_id).first() if not message_exists: # FIND PARENT COMMENT, SO WE CAN IDENTIFY WHO REACHED OUT parent_message = Messages.query.filter_by( recipient=reddit_username_of_new_message ).filter_by(ca_user_id_assoc='parent').first() if parent_message: # GET THE SENDERS EMAIL sender = parent_message.sender # GET THE BODY TEXT OF THE NEW MESSAGE body = message.body parent_message_subect = parent_message.subject # THE IDEA IS TO CODE THE REDDIT-EMAIL LINK IN JSON: reddit_user_email_id = "\"username\": \"{reddit_username_of_new_message}\", " \ "\"message_id\": \"{message_id}\", " \ "\"subject\": \"{subject}\"".format( reddit_username_of_new_message=reddit_username_of_new_message, message_id=message_id, subject=message.subject) subject = "{" + reddit_user_email_id + "}" # STORE MESSAGE IN DATABASE ca_message = Messages( sender=reddit_username_of_new_message, recipient=sender, body=body, subject=subject, date_sent=datetime.datetime.now(), has_been_sent_for_processing=0, ca_user_id_assoc=message.parent_id) # WE HAVE ADDED NEW MESSAGE TO DB, TIME TO EMAIL THE COMPLAINING ABOUT USER WHO STARTED CONVO # We want to notify the user that they received a response Messages.add_record(ca_message) # TODO: UPDATE FOR PROD self.send_email(sender, "*****@*****.**", body, subject) ca_message.has_been_sent_for_processing = 1 self.reddit.reddit_conn.inbox.mark_read([message]) db.session.commit() else: # IF PARENT MESSAGE DOESNT EXIST, MARK AS READ self.reddit.reddit_conn.inbox.mark_read([message]) except Exception as e: logger.info("EXCEPTION IN REDDIT READER") traceback.print_exc() # logger.info("NOTHING NEW IN INBOX STREAM--SLEEPING") time.sleep(100)