Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)