Exemplo n.º 1
0
    def a_question_was_asked(self, user_email, mail, messageid):
        """"
        Process a question that was asked by a user.
        """

        mail_subject = str(mail['subject'])

        logmsg = 'The user has a question, please take care of that!'
        c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
        c.send_email(self.sender_queue, user_email, "", "Question", "", "", "")

        # was the question asked to a specific task_nr that is valid?
        search_obj = re.search('[0-9]+', mail_subject, )

        if (search_obj != None) and int(search_obj.group()) <= c.get_num_tasks(self.coursedb, \
                                            self.logger_queue, self.name):
            fwd_mails = self.get_taskoperator_emails(search_obj.group())

        else:
            fwd_mails = self.get_admin_emails()

        for mail_address in fwd_mails:
            c.send_email(self.sender_queue, mail_address, "", "QFwd", "", mail, messageid)

        c.increment_db_statcounter(self.semesterdb, 'nr_questions_received', \
                                   self.logger_queue, self.name)
Exemplo n.º 2
0
    def send_out_email(self, recipient, message, msg_type):
        """
        connect to the smtp server and send out an e-mail
        """

        try:
            # connecting to smtp server
            if self.smtp_info["security"] == 'ssl':
                server = smtplib.SMTP_SSL(self.smtp_info["server"],
                                          int(self.smtp_info["port"]))
            else:
                server = smtplib.SMTP(self.smtp_info["server"],
                                      int(self.smtp_info["port"]))

            #server.ehlo_or_helo_if_needed()
            server.ehlo()

            if self.smtp_info["security"] == 'starttls':
                server.starttls()

            server.login(self.smtp_info["user"], self.smtp_info["passwd"])
        except smtplib.SMTPConnectError:
            logmsg = "Error while login to server with security= " + \
                     self.smtp_info["security"] + " , port= " + str(self.smtp_info["port"])
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
        except smtplib.SMTPAuthenticationError:
            logmsg = ("Authentication error")
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
        except Exception as exc:
            logmsg = str(exc)
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
            logmsg = "Error with server connection with security= " + \
                     self.smtp_info["security"] + " , port= " + str(self.smtp_info["port"])
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")

        try:
            server.sendmail(self.smtp_info["mail"], recipient.split(','),
                            message)
            server.close()
            c.log_a_msg(self.queues["logger"], self.name,\
            "Successfully sent an e-mail of type '{0}' to {1}!".format(msg_type, recipient), "INFO")
            c.increment_db_statcounter(self.dbs["semester"], 'nr_mails_sent', \
                                       self.queues["logger"], self.name)
        except Exception as exc:
            logmsg = str(exc)
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
            c.log_a_msg(
                self.queues["logger"], self.name,
                "Failed to send out an e-mail of type '{0}'!".format(msg_type),
                "ERROR")
Exemplo n.º 3
0
    def send_out_email(self, recipient, message, msg_type):
        """
        connect to the smtp server and send out an e-mail
        """
        try:
            # connecting to smtp server
            if self.smtp_security == 'ssl':
                server = smtplib.SMTP_SSL(self.smtp_server,
                                          int(self.smtp_port))
            else:
                server = smtplib.SMTP(self.smtp_server, int(self.smtp_port))

            #server.ehlo_or_helo_if_needed()
            server.ehlo()

            if self.smtp_security == 'starttls':
                server.starttls()

            server.login(self.smtp_user, self.smtp_pwd)
        except smtplib.SMTPConnectError:
            logmsg = "Error while login to server with security= " + \
                     self.smtp_security + " , port= " + str(self.smtp_port)
            c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
        except smtplib.SMTPAuthenticationError:
            logmsg = ("Authentication error")
            c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
        except:
            logmsg = "Error with server connection with security= " + \
                     self.smtp_security + " , port= " + str(self.smtp_port)
            c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")

        try:
            server.sendmail(self.smtp_mail, recipient, message)
            server.close()
            c.log_a_msg(
                self.logger_queue, self.name,
                "Successfully sent an e-mail of type '{0}'!".format(msg_type),
                "DEBUG")
            c.increment_db_statcounter(self.semesterdb, 'nr_mails_sent', \
                                       self.logger_queue, self.name)
        except Exception as e:
            logmsg = str(e)
            c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
            c.log_a_msg(
                self.logger_queue, self.name,
                "Failed to send out an e-mail of type '{0}'!".format(msg_type),
                "ERROR")
Exemplo n.º 4
0
 def send_out_email(self, recipient, message, msg_type):
     """
     connect to the smtp server and send out an e-mail
     """
     try:
         # port 465 doesn't seem to work!
         server = smtplib.SMTP(self.smtpserver, 587)
         server.ehlo()
         server.starttls()
         server.login(self.autosub_user, self.mail_pwd)
         server.sendmail(self.mail_user, recipient, message)
         server.close()
         c.log_a_msg(self.logger_queue, self.name, "Successfully sent an e-mail of type '{0}'!".format(msg_type), "DEBUG")
         c.increment_db_statcounter(self.semesterdb, 'nr_mails_sent', \
                                    self.logger_queue, self.name)
     except:
         c.log_a_msg(self.logger_queue, self.name, "Failed to send out an e-mail of type '{0}'!".format(msg_type), "ERROR")
Exemplo n.º 5
0
    def a_question_was_asked(self, user_id, user_email, mail, messageid):
        """
        Process a question that was asked by a user.
        """

        mail_subject = str(mail['subject'])

        logmsg = 'The user has a question, please take care of that!'
        c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
        c.send_email(self.sender_queue, user_email, "", "Question", "", "", "")

        # was the question asked to a specific task_nr that is valid?
        search_obj = re.search(
            '[0-9]+',
            mail_subject,
        )

        if (search_obj != None) and int(search_obj.group()) <= c.get_num_tasks(self.coursedb, \
                                            self.logger_queue, self.name):
            tasknr = search_obj.group()
            fwd_mails = self.get_taskoperator_emails(tasknr)
            if fwd_mails == "":
                logmsg = ("Error getting the taskoperator email for task {0}. "
                          "Question from user with email={1} "
                          "dropped.").format(tasknr, user_email)
                c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
                return
        else:
            fwd_mails = self.get_admin_emails()
            if fwd_mails == "":
                logmsg = ("Error getting the admin email for task {0}. "
                          "Question from user with email={1} "
                          "dropped.").format(tasknr, user_email)
                c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
                return

        for mail_address in fwd_mails:
            c.send_email(self.sender_queue, mail_address, user_id, "QFwd", "",
                         mail, messageid)

        c.increment_db_statcounter(self.semesterdb, 'nr_questions_received', \
                                   self.logger_queue, self.name)
Exemplo n.º 6
0
    def a_status_is_requested(self, user_email, messageid):
        """
        Process a question about a user status.
        """

        curs, cons = c.connect_to_db(self.semesterdb, self.logger_queue, self.name)

        data = {'Email': user_email}
        sql_cmd = "SELECT UserId, CurrentTask FROM Users WHERE Email == :Email"
        curs.execute(sql_cmd, data)
        res = curs.fetchone()
        user_id = res[0]
        current_task = res[1]

        cons.close()

        c.send_email(self.sender_queue, user_email, user_id, "Status", current_task, \
                     "", messageid)
        c.increment_db_statcounter(self.semesterdb, 'nr_status_requests', \
                                   self.logger_queue, self.name)
Exemplo n.º 7
0
    def check_if_whitelisted(self, user_email):
        """
        Check if the given e-mail address is in the whitelist.
        """

        curs, cons = c.connect_to_db(self.semesterdb, self.logger_queue, self.name)

        data = {'Email': user_email}
        sql_cmd = "SELECT * FROM WhiteList WHERE Email == :Email"
        curs.execute(sql_cmd, data)
        res = curs.fetchone()

        cons.close()

        if res != None:
            return 1
        else:
            logmsg = "Got Mail from a User not on the WhiteList: " + user_email
            c.log_a_msg(self.logger_queue, self.name, logmsg, "Warning")
            c.increment_db_statcounter(self.semesterdb, 'nr_non_registered', \
                                       self.logger_queue, self.name)

            return 0
Exemplo n.º 8
0
    def a_status_is_requested(self, user_id, user_email, messageid):
        """
        Tell sender to send out a status email.
        """
        logmsg = ("STATUS requested: User with UserId:{0}, Email: {1}").format(\
                 user_id, user_email)
        c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")

        curs, cons = c.connect_to_db(self.semesterdb, self.logger_queue,
                                     self.name)

        data = {'user_id': user_id}
        sql_cmd = "SELECT CurrentTask FROM Users WHERE UserId == :user_id"
        curs.execute(sql_cmd, data)
        res = curs.fetchone()
        current_task = res[0]

        cons.close()

        c.send_email(self.sender_queue, user_email, user_id, "Status", current_task, \
                     "", messageid)
        c.increment_db_statcounter(self.semesterdb, 'nr_status_requests', \
                                   self.logger_queue, self.name)
Exemplo n.º 9
0
    def check_if_whitelisted(self, user_email):
        """
        Check if the given e-mail address is in the whitelist.
        """

        curs, cons = c.connect_to_db(self.dbs["semester"],
                                     self.queues["logger"], self.name)

        data = {'Email': user_email}
        sql_cmd = "SELECT * FROM WhiteList WHERE Email == :Email"
        curs.execute(sql_cmd, data)
        res = curs.fetchone()

        cons.close()

        if res != None:
            return True

        logmsg = "Got mail from a user not on the WhiteList: " + user_email
        c.log_a_msg(self.queues["logger"], self.name, logmsg, "Warning")
        c.increment_db_statcounter(self.dbs["semester"], 'nr_non_registered', \
                                   self.queues["logger"], self.name)

        return False
Exemplo n.º 10
0
    def a_question_was_asked(self, user_id, user_email, mail, message_id):
        """
        Process a question that was asked by a user.
        """

        mail_subject = str(mail['subject'])

        logmsg = 'The user has a question, please take care of that!'
        c.log_a_msg(self.queues["logger"], self.name, logmsg, "DEBUG")

        # was the question asked to a specific task_nr
        search_obj = re.search(
            '[0-9]+',
            mail_subject,
        )

        task_nr = ""

        if (search_obj != None):
            task_nr = search_obj.group()

            #task with this task_nr exists?
            is_task = c.is_valid_task_nr(self.dbs["course"], task_nr, self.queues["logger"], \
                                         self.name)

            if not is_task:
                # task_nr is not valid
                c.send_email(self.queues["sender"], user_email, "", "InvalidTask", str(task_nr), \
                             "", message_id)

                logmsg = ("Question from user with email {0} contains an "
                          "invalid TaskNr. Informing user, message dropped"
                          ).format(user_email)
                c.log_a_msg(self.queues["logger"], self.name, logmsg, "INFO")

                return

            fwd_mails = self.get_taskoperator_emails(task_nr)
            if not fwd_mails:
                logmsg = ("Error getting the taskoperator email for task {0}. "
                          "Question from user with email={1} "
                          "dropped.").format(task_nr, user_email)
                c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
                return
        else:
            fwd_mails = self.get_admin_emails()
            if not fwd_mails:
                logmsg = ("Error getting the admin email."
                          "Question from user with email={1} "
                          "dropped.").format(task_nr, user_email)
                c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
                return

        # send Question received message to user
        c.send_email(self.queues["sender"], user_email, "", "Question", "", "",
                     "")

        # forward email to admins/taskoperators
        mail["Reply-To"] = user_email

        c.send_email(self.queues["sender"], fwd_mails, user_id, "QFwd",
                     task_nr, mail, message_id)

        c.increment_db_statcounter(self.dbs["semester"], 'nr_questions_received', \
                                   self.queues["logger"], self.name)
Exemplo n.º 11
0
    def handle_new(self, m):
        """
        Fetch new emails and initiate appropriate action
        """

        uid_of_mid = self.idmap_new_emails(m)

        # no new or imap connection error
        if not uid_of_mid:
            return

        curs, cons = c.connect_to_db(self.dbs["semester"],
                                     self.queues["logger"], self.name)

        # iterate over all new e-mails and take action according to the structure
        # of the subject line
        for message_id, uid in uid_of_mid.items():
            c.increment_db_statcounter(self.dbs["semester"], 'nr_mails_fetched', \
                                       self.queues["logger"], self.name)

            # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you
            # can ask for headers only, etc
            try:
                resp, data = m.uid('fetch', uid, "(RFC822)")
            except Exception as e:
                logmsg = ("Failed to fetch message with uid {0} from "
                          "inbox with error {1}").format(uid, str(e))
                c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
                continue

            # parsing the mail content to get a mail object
            mail = email.message_from_bytes(data[0][1])

            mail_subject = str(mail['subject'])
            from_header = str(mail['From'])
            split_header = str(from_header).split("<")
            user_name = split_header[0]

            try:
                user_email = str(split_header[1].split(">")[0])
            except:
                user_email = str(mail['From'])

            # Now let's decide what actions to take with the received email
            whitelisted = self.check_if_whitelisted(user_email)
            if whitelisted:
                # On Whitelist
                data = {'Email': user_email}
                sql_cmd = "SELECT UserId FROM Users WHERE Email = :Email"
                curs.execute(sql_cmd, data)
                res = curs.fetchone()

                if res != None:
                    # Already registered
                    user_id = res[0]
                    logmsg = ("Got mail from an already known user! "
                              "(UserId:{0}, Email:{1}").format(
                                  user_id, user_email)
                    c.log_a_msg(self.queues["logger"], self.name, logmsg,
                                "INFO")

                    # Take action based on the subject
                    self.action_by_subject(user_id, user_email, message_id, mail, \
                                      mail_subject)

                else:
                    # Not yet registered
                    reg_deadline = self.get_registration_deadline()

                    if reg_deadline > datetime.datetime.now():
                        # Before Registraton deadline?
                        #Name for user specified in Whitelist? -> take it
                        data = {'Email': user_email}
                        sql_cmd = ("SELECT Name FROM Whitelist "
                                   "WHERE Email = :Email")
                        curs.execute(sql_cmd, data)
                        res = curs.fetchone()
                        if res[0] and res[0].strip():
                            user_name = res[0]

                        # Create user and send Welcome message
                        self.add_new_user(user_name, user_email)
                        c.send_email(self.queues["sender"], user_email, "", "Welcome", \
                                     "", "", message_id)
                    else:
                        # After Registration deadline
                        c.send_email(self.queues["sender"], user_email, "", "RegOver", \
                                     "", "", message_id)
            else:
                # Not on Whitelist

                # Check if user has an UserID and was therefore deleted after registration
                data = {'Email': user_email}
                sql_cmd = "SELECT UserId FROM Users WHERE Email = :Email"
                curs.execute(sql_cmd, data)
                res = curs.fetchone()

                if res == None:
                    # Not a registered user
                    c.send_email(self.queues["sender"], user_email, "", "NotAllowed", \
                             "", "", message_id)
                else:
                    # A registered user, who was removed from the whitelist after registration
                    c.send_email(self.queues["sender"], user_email, "", "DeletedFromWhitelist", \
                             "", "", message_id)

        cons.close()
Exemplo n.º 12
0
    def loop_code(self):
        """
        The code run in the while True loop of the mail fetcher thread.
        """

        m = self.connect_to_imapserver()

        if m != 0:
            curs, cons = c.connect_to_db(self.semesterdb, self.logger_queue, self.name)
            items = self.fetch_new_emails(m)

            # iterate over all new e-mails and take action according to the structure
            # of the subject line
            for emailid in items:

                c.increment_db_statcounter(self.semesterdb, 'nr_mails_fetched', \
                                           self.logger_queue, self.name)

                # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you
                # can ask for headers only, etc
                resp, data = m.fetch(emailid, "(RFC822)")

                # parsing the mail content to get a mail object
                mail = email.message_from_bytes(data[0][1])

                mail_subject = str(mail['subject'])
                from_header = str(mail['From'])
                split_header = str(from_header).split("<")
                user_name = split_header[0]

                try:
                    user_email = str(split_header[1].split(">")[0])
                except:
                    user_email = str(mail['From'])

                messageid = mail.get('Message-ID')

                whitelisted = self.check_if_whitelisted(user_email)

                if whitelisted:
                    data = {'Email': user_email}
                    sql_cmd = "SELECT UserId FROM Users WHERE Email = :Email"
                    curs.execute(sql_cmd, data)
                    res = curs.fetchall()

                    if res:
                        logmsg = "Got mail from an already known user!"
                        c.log_a_msg(self.logger_queue, self.name, logmsg, "INFO")

                        #TODO: Does sending a mail "Result bla" without number crash this?
                        if re.search('[Rr][Ee][Ss][Uu][Ll][Tt]', mail_subject):
                            searchObj = re.search('[0-9]+', mail_subject, )
                            if int(searchObj.group()) <= c.get_num_tasks(self.coursedb, \
                                    self.logger_queue, self.name):
                                logmsg = "Processing a Result, UserId:{0} TaskNr:{1}"\
                                         .format(user_email, searchObj.group())
                                c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
                                self.take_new_results(user_email, searchObj.group(), \
                                                      mail, messageid)
                            else:
                                logmsg = ("Given Task number is higher than actual Number"
                                          "of Tasks!")
                                c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
                                c.send_email(self.sender_queue, user_email, "", \
                                             "InvalidTask", "", "", messageid)
                        elif re.search('[Qq][Uu][Ee][Ss][Tt][Ii][Oo][Nn]', mail_subject):
                            self.a_question_was_asked(user_email, mail, messageid)
                        elif re.search('[Ss][Tt][Aa][Tt][Uu][Ss]', mail_subject):
                            self.a_status_is_requested(user_email, messageid)
                        else:
                            logmsg = ("Got a kind of message I do not understand. "
                                      "Sending a usage mail...")
                            c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")
                            c.send_email(self.sender_queue, user_email, "", "Usage", "", \
                                         "", messageid)

                    else:
                        reg_deadline = self.get_registration_deadline()

                        if reg_deadline > datetime.datetime.now():
                            self.add_new_user(user_name, user_email)
                            c.send_email(self.sender_queue, user_email, "", "Welcome", \
                                         "", "", messageid)
                        else:
                            c.send_email(self.sender_queue, user_email, "", "RegOver", \
                                         "", "", messageid)

                else:
                    c.send_email(self.sender_queue, user_email, "", "NotAllowed", \
                                 "", "", messageid)

            try:
                m.close()
            except imaplib.IMAP4.abort:
                logmsg = ("Closing connection to server was aborted "
                          "(probably a server-side problem). Trying to connect again ...")
                c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
                #m.close()
            except imaplib.IMAP4.error:
                logmsg = ("Got an error when trying to connect to the imap server."
                          "Trying to connect again ...")
                c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
            except:
                logmsg = ("Got an unknown exception when trying to connect to the "
                          "imap server. Trying to connect again ...")
                c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
            finally:
                logmsg = "closed connection to imapserver"
                c.log_a_msg(self.logger_queue, self.name, logmsg, "INFO")


            # check if messages have been handled and need to be archived now
            try:
                next_send_msg = self.arch_queue.get(False)
            except:
                next_send_msg = 'NONE'

            if next_send_msg != 'NONE':
                c.log_a_msg(self.logger_queue, self.name, "moving a message!!!!!!!", \
                            "INFO")
                m = self.connect_to_imapserver()

                for next_msg in next_send_msg:
                    email_ids = self.fetch_all_emails(m)

                    for emailid in email_ids:
                        typ, msg_data = m.fetch(str(int(emailid)), "(BODY[HEADER])")
                        mail = email.message_from_bytes(msg_data[0][1])
                        if mail['Message-ID'] == next_send_msg.get('mid'):
                            logmsg = "Moving Message with ID: {0}"\
                                     .format(mail['Message-ID'])
                            c.log_a_msg(self.logger_queue, self.name, logmsg, "DEBUG")

                            resp, data = m.fetch(emailid, "(UID)")
                            pattern_uid = re.compile('\d+ \(UID (?P<uid>\d+)\)')
                            match = pattern_uid.match(str(data[0]).split("'")[1])
                            msg_uid = match.group('uid')

                            result = m.uid('COPY', msg_uid, 'archive_vels')

                            if result[0] == 'OK':
                                mov, data = m.uid('STORE', msg_uid, '+FLAGS', \
                                                  '(\Deleted)')
                                m.expunge()
                            break

                # m==0 is only possible in test-code (e.g. load_test.py)
                if m != 0:
                    m.logout()

            cons.close()

        time.sleep(self.poll_period)
Exemplo n.º 13
0
    def loop_code(self):
        """
        The code run in the while True loop of the mail fetcher thread.
        """

        m = self.connect_to_imapserver()

        if m != 0:
            curs, cons = c.connect_to_db(self.semesterdb, self.logger_queue,
                                         self.name)
            items = self.fetch_new_emails(m)

            # iterate over all new e-mails and take action according to the structure
            # of the subject line
            for emailid in items:

                c.increment_db_statcounter(self.semesterdb, 'nr_mails_fetched', \
                                           self.logger_queue, self.name)

                # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you
                # can ask for headers only, etc
                resp, data = m.fetch(emailid, "(RFC822)")

                # parsing the mail content to get a mail object
                mail = email.message_from_bytes(data[0][1])

                mail_subject = str(mail['subject'])
                from_header = str(mail['From'])
                split_header = str(from_header).split("<")
                user_name = split_header[0]

                try:
                    user_email = str(split_header[1].split(">")[0])
                except:
                    user_email = str(mail['From'])

                messageid = mail.get('Message-ID')

                # Now let's decide what actions to take with the received email

                whitelisted = self.check_if_whitelisted(user_email)
                if whitelisted:
                    # On Whitelist
                    data = {'Email': user_email}
                    sql_cmd = "SELECT UserId FROM Users WHERE Email = :Email"
                    curs.execute(sql_cmd, data)
                    res = curs.fetchone()

                    if res != None:
                        # Already registered
                        user_id = res[0]
                        logmsg = ("Got mail from an already known user! "
                                  "(UserId:{0}, Email:{1}").format(
                                      user_id, user_email)
                        c.log_a_msg(self.logger_queue, self.name, logmsg,
                                    "INFO")

                        # Take action based on the subject
                        self.action_by_subject(user_id, user_email, messageid, mail, \
                                          mail_subject)

                    else:
                        # Not yet registered
                        reg_deadline = self.get_registration_deadline()

                        if reg_deadline > datetime.datetime.now():
                            # Before Registraton deadline
                            self.add_new_user(user_name, user_email)
                            c.send_email(self.sender_queue, user_email, "", "Welcome", \
                                         "", "", messageid)
                        else:
                            # After Registration deadline
                            c.send_email(self.sender_queue, user_email, "", "RegOver", \
                                         "", "", messageid)
                else:
                    # Not on Whitelist
                    c.send_email(self.sender_queue, user_email, "", "NotAllowed", \
                                 "", "", messageid)

            try:
                m.close()
            except imaplib.IMAP4.abort:
                logmsg = (
                    "Closing connection to server was aborted "
                    "(probably a server-side problem). Trying to connect again ..."
                )
                c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
                #m.close()
            except imaplib.IMAP4.error:
                logmsg = (
                    "Got an error when trying to connect to the imap server."
                    "Trying to connect again ...")
                c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
            except:
                logmsg = (
                    "Got an unknown exception when trying to connect to the "
                    "imap server. Trying to connect again ...")
                c.log_a_msg(self.logger_queue, self.name, logmsg, "ERROR")
            finally:
                logmsg = "closed connection to imapserver"
                c.log_a_msg(self.logger_queue, self.name, logmsg, "INFO")

            # check if messages have been handled and need to be archived now
            try:
                next_send_msg = self.arch_queue.get(False)
            except:
                next_send_msg = 'NONE'

            if next_send_msg != 'NONE':
                c.log_a_msg(self.logger_queue, self.name, "moving a message!!!!!!!", \
                            "INFO")
                m = self.connect_to_imapserver()
                archive_dir = self.get_archive_dir()

                for next_msg in next_send_msg:
                    email_ids = self.fetch_all_emails(m)

                    for emailid in email_ids:
                        typ, msg_data = m.fetch(str(int(emailid)),
                                                "(BODY[HEADER])")
                        mail = email.message_from_bytes(msg_data[0][1])
                        if mail['Message-ID'] == next_send_msg.get('mid'):
                            logmsg = "Moving Message with ID: {0}"\
                                     .format(mail['Message-ID'])
                            c.log_a_msg(self.logger_queue, self.name, logmsg,
                                        "DEBUG")

                            resp, data = m.fetch(emailid, "(UID)")
                            pattern_uid = re.compile(
                                '\d+ \(UID (?P<uid>\d+)\)')
                            match = pattern_uid.match(
                                str(data[0]).split("'")[1])
                            msg_uid = match.group('uid')

                            result = m.uid('COPY', msg_uid, archive_dir)

                            if result[0] == 'OK':
                                mov, data = m.uid('STORE', msg_uid, '+FLAGS', \
                                                  '(\Deleted)')
                                m.expunge()
                            else:
                                log_msg = (
                                    "Error moving a message. Is the "
                                    "configured archive_dir '{0}' existing "
                                    "on the IMAP server?!").format(archive_dir)
                                c.log_a_msg(self.logger_queue, self.name, \
                                    log_msg, "ERROR")
                            break

                # m==0 is only possible in test-code (e.g. load_test.py)
                if m != 0:
                    m.logout()

            cons.close()

        time.sleep(self.poll_period)
Exemplo n.º 14
0
    def send_out_email(self, recipient, message, msg_type, retry_cnt):
        """
        connect to the smtp server and send out an e-mail
        """

        try:
            logmsg=""

            # DEBUG: Just a debug excpetion for testing failed email sending
            #if msg_type == "Status":
            #    raise Exception("Fake Exception for testing resending")

            # connecting to smtp server
            if self.smtp_info["security"] == 'ssl':
                server = smtplib.SMTP_SSL(self.smtp_info["server"], int(self.smtp_info["port"]))
            else:
                server = smtplib.SMTP(self.smtp_info["server"], int(self.smtp_info["port"]))

            #server.ehlo_or_helo_if_needed()
            server.ehlo()

            if self.smtp_info["security"] == 'starttls':
                server.starttls()

            server.login(self.smtp_info["user"], self.smtp_info["passwd"])
        except smtplib.SMTPConnectError:
            logmsg = "Error while login to server with security= " + \
                     self.smtp_info["security"] + " , port= " + str(self.smtp_info["port"])
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
        except smtplib.SMTPAuthenticationError:
            logmsg = ("Authentication error")
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
        except Exception as exc:
            logmsg = str(exc)
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
            logmsg = "Error with server connection with security= " + \
                     self.smtp_info["security"] + " , port= " + str(self.smtp_info["port"])
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
        finally:
            if logmsg != "":
                # failed to send the mail, retry according to config
                self.resend_mail(msg_type,recipient,message,retry_cnt)

                try:
                     server.close()
                except Exception as exc:
                    logmsg = str(exc)
                    c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
                return

        try:
            # DEBUG: Just a debug exception for testing failed email sending
            #if msg_type == "NoMultipleRequest":
            #    raise Exception("Fake Exception for testing resending")
            #if msg_type == "RetrySendingFailedMail":
            #    if retry_cnt<9:
            #        raise Exception("Fake Exception for testing resending")

            server.sendmail(self.smtp_info["mail"], recipient.split(','), message)

            c.log_a_msg(self.queues["logger"], self.name,\
            "Successfully sent an e-mail of type '{0}' to {1}!".format(msg_type, recipient), "INFO")
            c.increment_db_statcounter(self.dbs["semester"], 'nr_mails_sent', \
                                       self.queues["logger"], self.name)
        except Exception as exc:
            logmsg = str(exc)
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
            c.log_a_msg(self.queues["logger"], self.name, ("Failed to send out an e-mail of type "
                        "'{0} for user {1}'!").format(msg_type,recipient), "ERROR")

            # failed to send the mail, retry according to config
            self.resend_mail(msg_type, recipient, message,retry_cnt)
            try:
                server.close()
            except Exception as exc:
                logmsg = str(exc)
                c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")
            return

        try:
            server.close()
        except Exception as exc:
            logmsg = str(exc)
            c.log_a_msg(self.queues["logger"], self.name, logmsg, "ERROR")