def getMails():
    sql = "select id, sendto, smtp_host, subject, content, attach_files, send_count, priority, create_time, send_count, state from mails where state=%s and send_count<%s order by priority desc, send_count asc, create_time asc, id asc limit %s" % (constants.MAIL_INIT, constants.SEND_RETRY_COUNT, constants.READ_CONUT)
    mails = dbconn().getAll(sql)
    if len(mails) != 0:#将读取到的邮件状态修改为加载完成状态(2)
        ids = map( lambda a: str(a["id"]), mails)
        updateStateByIds(state=constants.MAIL_LOADED, ids=ids, time='loaded_time')
    return mails
Beispiel #2
0
def serviceLoop():
    #启动服务器之前,先把邮件表的状态全部修改为初始状态
    count = updateStateAll(constants.MAIL_INIT)
    print "服务器启动修改所有待发送邮件为初始状态:%s" % count
    #time.sleep(1000)

    #创建进程池(大小为10)
    pool = mul.Pool(processes=3)
    global processCount
    processCount = 3

    #i = 0
    unvalid_mial = False
    while True:
        #发邮件当网络堵塞,event_network_except会设置成true
        if event_network_except.is_set():
            event_network_except.wait(constants.SLEEP_TIME_NETWORK_EXCEPT)  #等待
            event_network_except.clear()  #清楚set

        print "开始获取邮件"
        mails = []
        if unvalid_mial == False:
            mails = getMails()

        if len(mails) == 0:
            #print "获取邮件成功 count: %s" % len(mails)
            print "主进程等待时间:%s" % constants.SLEEP_TIME_UNSENDING
            event_unsending.wait(constants.SLEEP_TIME_UNSENDING)
            unvalid_mial = False
        else:
            unvalid_mial = True
            print "获取邮件成功 count: %s" % len(mails)
            for mail in mails:
                while processCount <= 0:
                    time.sleep(1)

                if isContinue(mail):
                    #修改为初始状态,优先级降级
                    updatePriority(mail=mail,
                                   state=constants.MAIL_INIT,
                                   priority=mail['priority'] - 1)
                    continue

                unvalid_mial = False
                #i = i + 1
                #print "i=%s" % i
                #修改邮件为已分配状态,并将邮件分配给一个单独进程
                processCount = processCount - 1
                updateStateByIds(state=constants.MAIL_ASSIGNED,
                                 ids=mail['id'],
                                 time=constants.TIME_ASSIGN)
                pool.apply_async(func=sendMails,
                                 args=(mail, ),
                                 callback=increaseProcessCount)
                #time.sleep(10000000)

    pool.close()  #关闭进程池,不再创建新的进程
    pool.join()  #等带进程池中的所有进程结束
Beispiel #3
0
def getMails():
    sql = "select id, sendto, smtp_host, subject, content, attach_files, send_count, priority, create_time, send_count, state from mails where state=%s and send_count<%s order by priority desc, send_count asc, create_time asc, id asc limit %s" % (
        constants.MAIL_INIT, constants.SEND_RETRY_COUNT, constants.READ_CONUT)
    mails = dbconn().getAll(sql)
    if len(mails) != 0:  #将读取到的邮件状态修改为加载完成状态(2)
        ids = map(lambda a: str(a["id"]), mails)
        updateStateByIds(state=constants.MAIL_LOADED,
                         ids=ids,
                         time='loaded_time')
    return mails
def serviceLoop():
    #启动服务器之前,先把邮件表的状态全部修改为初始状态
    count = updateStateAll(constants.MAIL_INIT)
    print "服务器启动修改所有待发送邮件为初始状态:%s" % count
    #time.sleep(1000)
    
    #创建进程池(大小为10)
    pool = mul.Pool(processes=3)
    global processCount
    processCount = 3 
    
    #i = 0
    unvalid_mial = False
    while True:
        #发邮件当网络堵塞,event_network_except会设置成true
        if event_network_except.is_set():
            event_network_except.wait(constants.SLEEP_TIME_NETWORK_EXCEPT)#等待
            event_network_except.clear()#清楚set
        
        print "开始获取邮件"
        mails = []
        if unvalid_mial==False:
            mails = getMails()
            
        if len(mails) == 0:
            #print "获取邮件成功 count: %s" % len(mails)
            print "主进程等待时间:%s" % constants.SLEEP_TIME_UNSENDING
            event_unsending.wait(constants.SLEEP_TIME_UNSENDING)
            unvalid_mial = False
        else:
            unvalid_mial = True
            print "获取邮件成功 count: %s" % len(mails)
            for mail in mails:
                while processCount <= 0:
                    time.sleep(1)
                
                if isContinue(mail):
                    #修改为初始状态,优先级降级
                    updatePriority(mail=mail, state=constants.MAIL_INIT, priority=mail['priority']-1)
                    continue
                
                unvalid_mial = False
                #i = i + 1
                #print "i=%s" % i
                #修改邮件为已分配状态,并将邮件分配给一个单独进程
                processCount = processCount - 1
                updateStateByIds(state=constants.MAIL_ASSIGNED, ids=mail['id'], time=constants.TIME_ASSIGN)
                pool.apply_async(func=sendMails, args=(mail,), callback=increaseProcessCount)
                #time.sleep(10000000)
                
    pool.close()#关闭进程池,不再创建新的进程
    pool.join()#等带进程池中的所有进程结束
 def sendMails(self):
     #发送邮件
     logger.info("开始发送邮件:id=%s" % self.mail['id'])
     #time.sleep(1)
     #修改为正在发送状态
     updateStateByIds(constants.MAIL_SENDING, ids=self.mail['id'], time=constants.TIME_SENDING)
     sm = SendMails(self.mail)
     result = sm.sendMail()
     
     if result == constants.MAIL_SUCCESS:
         #发送邮件成功,将本邮件发到成功表
         updateStateByIds(state = constants.MAIL_SUCCESS, ids=self.mail['id'], time=constants.TIME_FINISH)
         logger.info("发送邮件成功,将本邮件发到成功表id=%s" % self.mail['id'])
     elif result == constants.MAIL_RETRY:
         #发送邮件失败,修改状态改为初始状态,发送次数count+1
         logger.debug("发送邮件失败,修改发送次数count+1 id=%s" % self.mail['id'])
         self.sendRetry(self.mail)
     elif result == constants.MAIL_NETWORK_EXCEPT:
         #修改邮件为初始状态
         updateStateByIds(state = constants.MAIL_INIT, ids=self.mail['id'])
         #将主进程睡眠
         global event_network_except
         event_network_except.set()
         logger.debug("发送邮件失败,网络错误,睡眠 id=%s" % self.mail['id'])
     elif result == constants.MAIL_ATTACH_EXCEPT:
         #发送邮件失败,附件错误
         updateStateByIds(state = constants.MAIL_ATTACH_EXCEPT, ids=self.mail['id'], time=constants.TIME_FINISH)
         logger.debug("发送邮件失败,附件路径错误,  id=%s" % self.mail['id'])
     return result
    def sendMails(self):
        #发送邮件
        logger.info("开始发送邮件:id=%s" % self.mail['id'])
        #time.sleep(1)
        #修改为正在发送状态
        updateStateByIds(constants.MAIL_SENDING,
                         ids=self.mail['id'],
                         time=constants.TIME_SENDING)
        sm = SendMails(self.mail)
        result = sm.sendMail()

        if result == constants.MAIL_SUCCESS:
            #发送邮件成功,将本邮件发到成功表
            updateStateByIds(state=constants.MAIL_SUCCESS,
                             ids=self.mail['id'],
                             time=constants.TIME_FINISH)
            logger.info("发送邮件成功,将本邮件发到成功表id=%s" % self.mail['id'])
        elif result == constants.MAIL_RETRY:
            #发送邮件失败,修改状态改为初始状态,发送次数count+1
            logger.debug("发送邮件失败,修改发送次数count+1 id=%s" % self.mail['id'])
            self.sendRetry(self.mail)
        elif result == constants.MAIL_NETWORK_EXCEPT:
            #修改邮件为初始状态
            updateStateByIds(state=constants.MAIL_INIT, ids=self.mail['id'])
            #将主进程睡眠
            global event_network_except
            event_network_except.set()
            logger.debug("发送邮件失败,网络错误,睡眠 id=%s" % self.mail['id'])
        elif result == constants.MAIL_ATTACH_EXCEPT:
            #发送邮件失败,附件错误
            updateStateByIds(state=constants.MAIL_ATTACH_EXCEPT,
                             ids=self.mail['id'],
                             time=constants.TIME_FINISH)
            logger.debug("发送邮件失败,附件路径错误,  id=%s" % self.mail['id'])
        return result
 def run(self):
     #启动服务器之前,先把邮件表的状态全部修改为初始状态
     updateStateAll(constants.MAIL_INIT)
     logger.info("服务器启动修改所有待发送邮件为初始状态")
     #time.sleep(1000)
     
     #创建进程池(大小为10)
     pool = mul.Pool(processes=3)
     global processCount
     processCount = 3 
     
     #i = 0
     unvalid_mial = False
     while True:
         #发邮件当网络堵塞,event_network_except会设置成true
         if event_network_except.is_set():
             event_network_except.wait(constants.SLEEP_TIME_NETWORK_EXCEPT)#等待
             event_network_except.clear()#清楚set
         
         #print "开始获取邮件"
         mails = []
         if unvalid_mial==False:
             mails = self.getMails()
             
         if len(mails) == 0:
             #print "获取邮件成功 count: %s" % len(mails)
             logger.info("主进程等待时间:%s" % constants.SLEEP_CLIENT_MAILS_REACH)
             self.glocker.wait(constants.SLEEP_CLIENT_MAILS_REACH)
             self.glocker.clear()
             unvalid_mial = False
         else:
             unvalid_mial = True
             logger.info("获取邮件成功 count: %s" % len(mails))
             for mail in mails:
                 while processCount <= 0:
                     time.sleep(1)
                 
                 if self.isContinue(mail):
                     #修改为初始状态,优先级降级
                     updatePriority(mail=mail, state=constants.MAIL_INIT, priority=mail['priority']-1)
                     continue
                 
                 unvalid_mial = False
                 
                 #判断邮件上次发送时间,如果再10内不需要发送
                 dayto = datetime.datetime.now()
                 datefrom = DateUtils.getDateBySeconds(dayto, constants.TIME_LIMIT_SECONDS)    
                 if mail['finish_time']!=None and mail['finish_time'] > datefrom:
                     logger.info("同一封邮件再10内被读取两次,修改邮件为初始状态,跳过该邮件id=%s" % mail['id'])
                     updateStateByIds(state = constants.MAIL_INIT, ids=mail['id'])
                     continue
                 
                 #i = i + 1
                 #print "i=%s" % i
                 #修改邮件为已分配状态,并将邮件分配给一个单独进程
                 processCount = processCount - 1
                 updateStateByIds(state=constants.MAIL_ASSIGNED, ids=mail['id'], time=constants.TIME_ASSIGN)
                 pool.apply_async(func=sendMails, args=(mail,), callback=self.increaseProcessCount)
                 #time.sleep(10000000)
                 
     pool.close()#关闭进程池,不再创建新的进程
     pool.join()#等带进程池中的所有进程结束
    def run(self):
        #启动服务器之前,先把邮件表的状态全部修改为初始状态
        updateStateAll(constants.MAIL_INIT)
        logger.info("服务器启动修改所有待发送邮件为初始状态")
        #time.sleep(1000)

        #创建进程池(大小为10)
        pool = mul.Pool(processes=3)
        global processCount
        processCount = 3

        #i = 0
        unvalid_mial = False
        while True:
            #发邮件当网络堵塞,event_network_except会设置成true
            if event_network_except.is_set():
                event_network_except.wait(
                    constants.SLEEP_TIME_NETWORK_EXCEPT)  #等待
                event_network_except.clear()  #清楚set

            #print "开始获取邮件"
            mails = []
            if unvalid_mial == False:
                mails = self.getMails()

            if len(mails) == 0:
                #print "获取邮件成功 count: %s" % len(mails)
                logger.info("主进程等待时间:%s" % constants.SLEEP_CLIENT_MAILS_REACH)
                self.glocker.wait(constants.SLEEP_CLIENT_MAILS_REACH)
                self.glocker.clear()
                unvalid_mial = False
            else:
                unvalid_mial = True
                logger.info("获取邮件成功 count: %s" % len(mails))
                for mail in mails:
                    while processCount <= 0:
                        time.sleep(1)

                    if self.isContinue(mail):
                        #修改为初始状态,优先级降级
                        updatePriority(mail=mail,
                                       state=constants.MAIL_INIT,
                                       priority=mail['priority'] - 1)
                        continue

                    unvalid_mial = False

                    #判断邮件上次发送时间,如果再10内不需要发送
                    dayto = datetime.datetime.now()
                    datefrom = DateUtils.getDateBySeconds(
                        dayto, constants.TIME_LIMIT_SECONDS)
                    if mail['finish_time'] != None and mail[
                            'finish_time'] > datefrom:
                        logger.info("同一封邮件再10内被读取两次,修改邮件为初始状态,跳过该邮件id=%s" %
                                    mail['id'])
                        updateStateByIds(state=constants.MAIL_INIT,
                                         ids=mail['id'])
                        continue

                    #i = i + 1
                    #print "i=%s" % i
                    #修改邮件为已分配状态,并将邮件分配给一个单独进程
                    processCount = processCount - 1
                    updateStateByIds(state=constants.MAIL_ASSIGNED,
                                     ids=mail['id'],
                                     time=constants.TIME_ASSIGN)
                    pool.apply_async(func=sendMails,
                                     args=(mail, ),
                                     callback=self.increaseProcessCount)
                    #time.sleep(10000000)

        pool.close()  #关闭进程池,不再创建新的进程
        pool.join()  #等带进程池中的所有进程结束