예제 #1
0
def detect_exception(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'detect_exception')
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    account_data_key = 'account:%s:%s:data' % (user_info.get('username'), user.get('userid'))        
    exist_account_data = r_session.get(account_data_key)
    if exist_account_data is None: return
    account_data = json.loads(exist_account_data.decode('utf-8'))

    extra_info_key='extra_info:%s' % (user_info.get('username'))
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'detect_info' not in extra_info.keys():
        detect_info={}
    else:
        detect_info=extra_info['detect_info']
    if not 'device_info' in account_data.keys(): return
    status_cn={'offline':'离线','online':'在线','exception':'异常'}
    for dev in account_data['device_info']:
        if 'status_list' not in detect_info.keys():
            detect_info['status_list']={}
        if dev['device_name'] not in detect_info['status_list'].keys():
            detect_info['status_list'][dev['device_name']]=dev['status']
        elif dev['status'] != detect_info['status_list'][dev['device_name']]:
            red_log(user, '矿机状态', '状态', '%s:%s -> %s' % (dev['device_name'],status_cn[detect_info['status_list'][dev['device_name']]],status_cn[dev['status']]))
        if dev['status'] != 'online':
            if 'updated_time' in detect_info.keys() and account_data['updated_time'] != detect_info['updated_time']:
                if 'last_warn' not in detect_info.keys() or (datetime.now() - datetime.strptime(detect_info['last_warn'],'%Y-%m-%d %H:%M:%S')).seconds > 60*60:
                    if validateEmail(user_info['mail_address']) == 1:
                        mail = dict()
                        mail['to'] = user_info['mail_address']
                        mail['subject'] = '云监工-矿机异常'
                        mail['text'] = ''.join(['您的矿机:',dev['device_name'],'<br />状态:',status_cn[dev['status']] ,'<br />时间:',datetime.now().strftime('%Y-%m-%d %H:%M:%S')])
                        send_email(mail,config_info)
                        detect_info['last_warn']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        if 'dcdn_clients' in dev.keys():
            for i,client in enumerate(dev['dcdn_clients']):
                space_last_key='space_%s:%s:%s' % (i,user.get('userid'),dev['device_name'])
                if space_last_key in detect_info.keys():
                    last_space=detect_info[space_last_key]
                    if last_space - 100*1024*1024 > int(client['space_used']):
                        red_log(user, '缓存变动', '状态', '%s:删除了%.2fGB缓存,当前%.2fGB' % (dev['device_name'],float(last_space)/1024/1024/1024-float(client['space_used'])/1024/1024/1024,float(client['space_used'])/1024/1024/1024))
                        detect_info[space_last_key] = int(client['space_used'])
                    elif last_space < int(client['space_used']):
                        detect_info[space_last_key] = int(client['space_used'])
                else:
                   detect_info[space_last_key] = int(client['space_used'])
    detect_info['updated_time'] = account_data['updated_time']
    extra_info['detect_info']=detect_info
    r_session.set(extra_info_key, json.dumps(extra_info))
예제 #2
0
def admin_message_send():
    send_type = request.values.get('type')
    to = request.values.get('to')
    subject = request.values.get('subject')
    summary = request.values.get('summary')
    content = request.values.get('content')

    if subject == '':
        session['error_message'] = '标题为必填。'
        return redirect(url_for('admin_message'))

    if to == '':
        session['error_message'] = '收件方必填。'
        return redirect(url_for('admin_message'))

    if summary == '':
        session['error_message'] = '简介必填'
        return redirect(url_for('admin_message'))

    send_content = '{:<30}'.format(summary) + content
    if send_type == 'message':
        user = session.get('user_info')
        if to == 'all':
            for b_username in r_session.smembers('users'):
                send_msg(b_username.decode('utf-8'), subject, send_content,
                         3600 * 24 * 31, user.get('username'))

        else:
            send_msg(to, subject, send_content, 3600 * 24 * 31,
                     user.get('username'))
    else:
        from mailsand import send_email
        from mailsand import validateEmail
        to_set = set(to.split(';'))
        to_list = list()
        for email in to_set:
            if validateEmail(email) == 1:
                to_list.append(email)
        config_key = '%s:%s' % ('user', 'system')
        config_info = json.loads(r_session.get(config_key).decode('utf-8'))
        mail = dict()
        mail['to'] = ",".join(to_list)
        mail['subject'] = subject
        mail['text'] = send_content
        if not send_email(mail, config_info):
            session['error_message'] = '发送失败,请检查邮件配置'

    return redirect(url_for(endpoint='admin_message'))
예제 #3
0
파일: admin.py 프로젝트: fengyuclub/crysadm
def admin_message_send():
    send_type = request.values.get('type')
    to = request.values.get('to')
    subject = request.values.get('subject')
    summary = request.values.get('summary')
    content = request.values.get('content')

    if subject == '':
        session['error_message'] = '标题为必填。'
        return redirect(url_for('admin_message'))

    if to == '':
        session['error_message'] = '收件方必填。'
        return redirect(url_for('admin_message'))

    if summary == '':
        session['error_message'] = '简介必填'
        return redirect(url_for('admin_message'))

    send_content = '{:<30}'.format(summary) + content
    if send_type=='message':
        user = session.get('user_info')
        if to == 'all':
            for b_username in r_session.smembers('users'):
                send_msg(b_username.decode('utf-8'), subject, send_content, 3600 * 24 * 31, user.get('username'))
    
        else:
            send_msg(to, subject, send_content, 3600 * 24 * 31,user.get('username'))
    else:
        from mailsand import send_email
        from mailsand import validateEmail
        to_set=set(to.split(';'))
        to_list=list()
        for email in to_set:
            if validateEmail(email) == 1:
                to_list.append(email)
        config_key = '%s:%s' % ('user', 'system')
        config_info = json.loads(r_session.get(config_key).decode('utf-8'))
        mail = dict()
        mail['to'] = ",".join(to_list)
        mail['subject'] = subject
        mail['text'] = send_content
        if not send_email(mail,config_info):
            session['error_message']='发送失败,请检查邮件配置'
        
    return redirect(url_for(endpoint='admin_message'))
예제 #4
0
파일: admin.py 프로젝트: HuiMi24/crysadm
def test_email():
    from mailsand import send_email
    from mailsand import validateEmail
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))

    user = session.get('user_info')
    user_key = '%s:%s' % ('user', user.get('username'))
    user_info = json.loads(r_session.get(user_key).decode('utf-8'))

    session['action'] = 'info'
    if 'email' not in user_info.keys() or not validateEmail(user_info["email"]):
        session['error_message'] = '该账户的提醒邮件地址设置不正确,无法测试'
        return redirect(url_for('system_config'))
    mail = dict()
    mail['to'] = user_info['email']
    mail['subject'] = '云监工-测试邮件'
    mail['text'] = '这只是一个测试邮件,你更应该关注的不是这里面写了什么。不是么?'
    send_email(mail, config_info)
    return redirect(url_for('system_config'))
예제 #5
0
파일: admin.py 프로젝트: xugui0821/crysadm
def test_email():
    from mailsand import send_email
    from mailsand import validateEmail
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))

    user = session.get('user_info')
    user_key = '%s:%s' % ('user', user.get('username'))
    user_info = json.loads(r_session.get(user_key).decode('utf-8'))

    session['action'] = 'info'
    if 'email' not in user_info.keys() or not validateEmail(user_info["email"]):
       session['error_message']='该账户的提醒邮件地址设置不正确,无法测试'
       return redirect(url_for('system_config'))
    mail = dict()
    mail['to'] = user_info['email']
    mail['subject'] = '云监工-测试邮件'
    mail['text'] = '这只是一个测试邮件,你更应该关注的不是这里面写了什么。不是么?'
    send_email(mail,config_info)
    return redirect(url_for('system_config'))
예제 #6
0
def check_report(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report')
    extra_info_key='extra_info:%s' % (user_info.get('username'))
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'last_adjust_date' not in extra_info.keys() or datetime.strptime(extra_info['last_adjust_date'],'%Y-%m-%d %H:%M:%S').day != datetime.now().day:
        return
    if 'last_report_date' not in extra_info.keys():
        extra_info['last_report_date'] = '1997-1-1 1:1:1'
    if datetime.strptime(extra_info['last_report_date'],'%Y-%m-%d %H:%M:%S').day == datetime.now().day: return
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report')
    str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')
    yesterday_key = 'user_data:%s:%s' % (user_info.get('username'), str_yesterday)
    b_yesterday_data = r_session.get(yesterday_key)
    if b_yesterday_data is None: return
    yesterday_data = json.loads(b_yesterday_data.decode('utf-8'))
    if 'produce_stat' in yesterday_data.keys():
        if validateEmail(user_info['mail_address']) != 1: return
        mail = dict()
        mail['to'] = user_info['mail_address']
        mail['subject'] = '云监工-收益报告'
        mail['text'] = """
<DIV style="BACKGROUND-COLOR: #e6eae9">
    <TABLE style="WIDTH: 100%; COLOR: #4f6b72; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px" cellSpacing=0 summary="The technical specifications of the Apple PowerMac G5 series">
        <CAPTION style="WIDTH: 700px; PADDING-BOTTOM: 5px; TEXT-ALIGN: center; PADDING-TOP: 0px; FONT: italic 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 0px; PADDING-RIGHT: 0px">
            收益报告
        </CAPTION>
        <TBODY>
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    矿主ID
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    平均速度(KB/S)
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    今日收益(¥)
                </TH>
            </TR>
    """
        td_speed={}
        td_produce={}
        s_sum=0
        p_sum=0
        for stat in yesterday_data['speed_stat']:
            s=0
            for i in range(0,24):
               s+=stat['dev_speed'][i]
            td_speed[stat['mid']]=s/24/8
            s_sum+=td_speed[stat['mid']]
        for j,stat in enumerate(yesterday_data['produce_stat']):
            s=0
            for i in range(1,25):
               s+=stat['hourly_list'][i]
            td_produce[stat['mid']]=s/10000
            p_sum+=td_produce[stat['mid']]
            if j % 2 == 0:
                mail['text']=mail['text'] + """
            <TR>
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
            else:
                mail['text']=mail['text'] + """
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #797268; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
        mail['text']=mail['text'] + """
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    总计
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (s_sum)) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (p_sum)) + """
                </TD>
            </TR>
        </TBODY>
    </TABLE>
</DIV>
    """
        send_email(mail,config_info)
        extra_info['last_report_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        r_session.set(extra_info_key,json.dumps(extra_info))
예제 #7
0
def detect_exception(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'detect_exception')
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    account_data_key = 'account:%s:%s:data' % (user_info.get('username'), user.get('userid'))        
    exist_account_data = r_session.get(account_data_key)
    if exist_account_data is None: return
    account_data = json.loads(exist_account_data.decode('utf-8'))

    extra_info_key='extra_info:%s' % (user_info.get('username'))
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'detect_info' not in extra_info.keys():
        detect_info={}
    else:
        detect_info=extra_info['detect_info']
    if not 'device_info' in account_data.keys(): return
    status_cn={'offline':'离线','online':'在线','exception':'异常'}
    warn_list=[]
    for dev in account_data['device_info']:
        if 'status_list' not in detect_info.keys():
            detect_info['status_list']={}
        if dev['device_name'] not in detect_info['status_list'].keys():
            detect_info['status_list'][dev['device_name']]=dev['status']
        elif dev['status'] != detect_info['status_list'][dev['device_name']]:
            red_log(user, '矿机状态', '状态', '%s:%s -> %s' % (dev['device_name'],status_cn[detect_info['status_list'][dev['device_name']]],status_cn[dev['status']]))
            detect_info['status_list'][dev['device_name']]=dev['status']
            if 'exception_occured' not in detect_info.keys():
                detect_info['exception_occured'] = True
        if dev['status'] != 'online':
            warn_list.append(dev);
        if 'dcdn_clients' in dev.keys():
            for i,client in enumerate(dev['dcdn_clients']):
                space_last_key='space_%s:%s:%s' % (i,user.get('userid'),dev['device_name'])
                if space_last_key in detect_info.keys():
                    last_space=detect_info[space_last_key]
                    if last_space - 100*1024*1024 > int(client['space_used']):
                        red_log(user, '缓存变动', '状态', '%s:删除了%.2fGB缓存,当前%.2fGB' % (dev['device_name'],float(last_space)/1024/1024/1024-float(client['space_used'])/1024/1024/1024,float(client['space_used'])/1024/1024/1024))
                        detect_info[space_last_key] = int(client['space_used'])
                    elif last_space < int(client['space_used']):
                        detect_info[space_last_key] = int(client['space_used'])
                else:
                   detect_info[space_last_key] = int(client['space_used'])
    if len(warn_list) != 0:
        if 'updated_time' in detect_info.keys() and account_data['updated_time'] != detect_info['updated_time']:
            if 'exception_occured' in detect_info.keys() and detect_info['exception_occured'] == True:
                if 'last_warn' not in detect_info.keys() or (datetime.now() - datetime.strptime(detect_info['last_warn'],'%Y-%m-%d %H:%M:%S')).seconds > 60*60:
                    if validateEmail(user_info['email']) == 1:
                        mail = dict()
                        mail['to'] = user_info['email']
                        mail['subject'] = '云监工-矿机异常'
                        mail['text'] = ''
                        for dev in warn_list:
                            mail['text'] = mail['text'].join(['您的矿机:',dev['device_name'],'<br />状态:',status_cn[dev['status']] ,'<br />时间:',datetime.now().strftime('%Y-%m-%d %H:%M:%S'),'<br />==================<br />'])
                        if send_email(mail,config_info) == True:
                            detect_info['last_warn']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                            detect_info['exception_occured'] = False
    else:
        detect_info.pop('exception_occured','^.^')

    detect_info['updated_time'] = account_data['updated_time']
    extra_info['detect_info']=detect_info
    r_session.set(extra_info_key, json.dumps(extra_info))
예제 #8
0
def check_report(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report')
    extra_info_key='extra_info:%s' % (user_info.get('username'))
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'last_adjust_date' not in extra_info.keys() or datetime.strptime(extra_info['last_adjust_date'],'%Y-%m-%d %H:%M:%S').day != datetime.now().day:
        return
    if 'last_report_date' not in extra_info.keys():
        extra_info['last_report_date'] = '1997-1-1 1:1:1'
    if datetime.strptime(extra_info['last_report_date'],'%Y-%m-%d %H:%M:%S').day == datetime.now().day: return
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report')
    str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')
    yesterday_key = 'user_data:%s:%s' % (user_info.get('username'), str_yesterday)
    b_yesterday_data = r_session.get(yesterday_key)
    if b_yesterday_data is None: return
    yesterday_data = json.loads(b_yesterday_data.decode('utf-8'))
    if 'produce_stat' in yesterday_data.keys():
        if validateEmail(user_info['email']) != 1: return
        mail = dict()
        mail['to'] = user_info['email']
        mail['subject'] = '云监工-收益报告'
        mail['text'] = """
<DIV style="BACKGROUND-COLOR: #e6eae9">
    <TABLE style="WIDTH: 100%; COLOR: #4f6b72; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px" cellSpacing=0 summary="The technical specifications of the Apple PowerMac G5 series">
        <CAPTION style="WIDTH: 700px; PADDING-BOTTOM: 5px; TEXT-ALIGN: center; PADDING-TOP: 0px; FONT: italic 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 0px; PADDING-RIGHT: 0px">
            收益报告
        </CAPTION>
        <TBODY>
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    矿主ID
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    平均速度(KB/S)
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    今日收益(¥)
                </TH>
            </TR>
    """
        td_speed={}
        td_produce={}
        s_sum=0
        p_sum=0
        for stat in yesterday_data['speed_stat']:
            s=0
            for i in range(0,24):
               s+=stat['dev_speed'][i]
            td_speed[stat['mid']]=s/24/8
            s_sum+=td_speed[stat['mid']]
        for j,stat in enumerate(yesterday_data['produce_stat']):
            s=0
            for i in range(1,25):
               s+=stat['hourly_list'][i]
            td_produce[stat['mid']]=s/10000
            p_sum+=td_produce[stat['mid']]
            if j % 2 == 0:
                mail['text']=mail['text'] + """
            <TR>
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
            else:
                mail['text']=mail['text'] + """
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #797268; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
        mail['text']=mail['text'] + """
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    总计
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (s_sum)) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (p_sum)) + """
                </TD>
            </TR>
        </TBODY>
        <TFOOT style="FONT-SIZE: 11px; BACKGROUND: none transparent scroll repeat 0% 0%">
            <TR>
                <TD colSpan=4 align=right>
                """ + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + """
                </TD>
            </TR>
        </TFOOT>
    </TABLE>
</DIV>
    """
        if send_email(mail,config_info) == True:
            extra_info['last_report_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        r_session.set(extra_info_key,json.dumps(extra_info))