前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python脚本email

Python脚本email

作者头像
py3study
发布2020-01-17 10:56:26
1.3K0
发布2020-01-17 10:56:26
举报
文章被收录于专栏:python3
代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import re
import string
import os
import time
import httplib
import urllib

import ConfigParser

import MySQLdb
from smtplib import SMTP

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
#from email.Header import Header
# python 2.3.*: email.Utils email.Encoders
from email.utils import COMMASPACE,formatdate
from email import encoders

#server['name'], server['user'], server['passwd']
def send_mail(server, fro, to, subject, text, files=[]): 
    assert type(server) == dict 
    assert type(to) == list 
    assert type(files) == list 
 
    msg = MIMEMultipart() 
    msg['From'] = fro 
    msg['Subject'] = subject 
    msg['To'] = COMMASPACE.join(to) #COMMASPACE==', ' 
    msg['Date'] = formatdate(localtime=True) 
    msg["Accept-Language"]="zh-CN"
    msg["Accept-Charset"]="ISO-8859-1,utf-8"
    txt=MIMEText(text)
    txt.set_charset("utf-8")
    msg.attach(txt) 
 
    for file in files: 
        part = MIMEBase('application', 'octet-stream') #'octet-stream': binary data 
        part.set_payload(open(file, 'rb'.read())) 
        encoders.encode_base64(part) 
        part.add_header('Content-Disposition', 'p_w_upload; filename="%s"' % os.path.basename(file)) 
        msg.attach(part) 
 
    #import smtplib 
    smtp = SMTP(server['name']) 
    smtp.login(server['user'], server['passwd']) 
    smtp.sendmail(fro, to, msg.as_string()) 
    smtp.close()


#tolist.split(',')
def send_sms(to,msg):
    '''
    send a sms
    '''
    if not to.isdigit():
        return
    if len(to) != 11:
        return

    params = urllib.urlencode({'mobiles':to, 'oauth_consumer_key': 'passport', 'oauth_signature': '(passprot-oauth-userkye%$&)2013-05-20publish','content':msg}) 
    headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36",
               "Content-type" : "application/x-www-form-urlencoded", 
               "Accept-Encoding" : "gzip,deflate,sdch",
               "Accept-Language" : "zh-CN,zh;q=0.8",
               "Accept" : "*/*"} 
    #http://sms.guagua.cn/sender/forthwith/smsess.do
    conn = httplib.HTTPConnection("sms.guagua.cn:80") 
    conn.request("POST", "/sender/forthwith/smsess.do", params, headers) 
    response = conn.getresponse()
    #print response.status, response.reason 
    #print response.msg
    #data = response.read()
    #print data
    conn.close()
    return {response.status:response.reason}


def read_ini():
    '''
    read db.ini file
    return list, length=5
    '''
    if not os.path.isfile('/usr/local/nagios/libexec/db.ini'):
        print ('db.ini not exsit!')
        return
 
    db_conf=[]

    cf = ConfigParser.ConfigParser()
    cf.read('/usr/local/nagios/libexec/db.ini')

    db_ip = cf.get('DB', 'ip')
    db_conf.append(db_ip)
    db_port = cf.getint('DB', 'port')
    db_conf.append(db_port)
    db_user = cf.get('DB', 'user')
    db_conf.append(db_user)
    db_pwd = cf.get('DB', 'pwd')
    db_conf.append(db_pwd)
    db_db = cf.get('DB', 'db')
    db_conf.append(db_db)

    return db_conf


def arg_parse(report_context):
    '''
    parse [COMM_MONITER:StatusLevel:serverType:serverid] by regex
    '''
    assert type(report_context) == list
    parselist = []
    pattern = re.compile(r'\[COMM_MONITER:(\d+):(\d+):(\d+)\](.*)')
    for line in report_context:
        match = pattern.findall(line)
        if match:
            parselist.append(match[0])

    return parselist

# OK 0
# WARNING 1
# CRITICAL 2
# UNKNOWN 3

def state_svr(state):
    ret = 3
    if 0 == cmp(state, 'OK'):
        ret = 0
    elif 0 == cmp(state, 'WARNING'):
        ret = 1
    elif 0 == cmp(state, 'CRITICAL'):
        ret = 2
    elif 0 == cmp(state, 'UNKNOWN'):
        ret = 3

    return ret
#"$HOSTALIAS$" 1 
#"$HOSTADDRESS$" 2
#"$LONGDATETIME$" 3
#"$SERVICESTATE$" 4
#"$SERVICEDESC$" 5
#"$SERVICEOUTPUT$$LONGSERVICEOUTPUT$" 6
#"$CONTACTEMAIL$" 7
#"$last_state_change$" 8
#"$sms$" 9 
#"$cmd$" 10 
def main():
    cur_pwd = os.getcwd()
    fp = open('/usr/local/nagios/libexec/mail.log','w')
    fp.write(cur_pwd+os.linesep)
    fp.write(str(len(sys.argv))+os.linesep)
    for a in sys.argv:
        fp.write(a+os.linesep)
    #fp.close()

    if len(sys.argv) < 11:
        fp.write('error sys.argv < 11!'+os.linesep)
        fp.close()
        return

    srv_ip = sys.argv[2]

    arg_tmp = sys.argv[6]+',cmd:'+sys.argv[10]
    fp.write(arg_tmp+os.linesep)
    srv_state = state_svr(sys.argv[4])

    mail = sys.argv[7]
    mail_addr = mail.split(',')

    last_state_chg = int(sys.argv[8])

    arg9 = sys.argv[9]
    mobilelist = arg9.split(',')

    mail_subject = sys.argv[1]+','+srv_ip+','+sys.argv[5]+','+sys.argv[4]
    #print arg_tmp
    svr_output = arg_tmp.split('\\n')
 
    # parse command line arg
    arg_list = arg_parse(svr_output)

    # read db.ini file
    db_conf = read_ini()
    if not db_conf:
        fp.write('read db.ini failed!'+os.linesep)
        fp.close()
        return
    fp.write('read db.ini suss!'+os.linesep)
    # connect mysql server
    conn = MySQLdb.Connection(host=db_conf[0], port=db_conf[1],user=db_conf[2], passwd=db_conf[3], db=db_conf[4])
    if not conn.open:
        fp.write('mysql connect failed!'+os.linesep)
        fp.close()
        return
    conn.select_db(db_conf[4])
    cur = conn.cursor()
    fp.write('mysql connect ret = '+str(conn.open)+os.linesep)
    # set charset = utf8
    cur.execute("SET NAMES utf8")
    #cur.execute("SET CHARACTER_SET_CLIENT=utf8")
    #cur.execute("SET CHARACTER_SET_RESULTS=utf8")
    conn.commit()

    # get current time
    cur_time = time.time()*1000
    g_server = {'name':'mail.17guagua.com','user':'ggmonitor@17guagua.com','passwd':r'\b=DS/7H'}
    g_fro     = 'ggmonitor@17guagua.com'

    g_subject = '联通'+mail_subject
    fp.write(g_subject+os.linesep)
    if len(arg_list) == 0:
        alarm_desc = arg_tmp.decode('utf-8').encode('utf-8') 
        t_server_alarm_log = "INSERT INTO t_service_alarm_log(service_id,server_type,service_ip,alarm_type,alarm_desc,alarm_time,store_time,last_state_change) \
        VALUES (%d,%d,'%s',%d,'%s',%d,%d,%d)" % (0,0,srv_ip,srv_state,alarm_desc,cur_time,cur_time,last_state_chg)
        cur.execute(t_server_alarm_log)
        fp.write('insert t_service_alarm_log suss!\n')
        # commit insert op
        conn.commit()
 
        # send warning mail
        send_mail(g_server,g_fro,mail_addr,g_subject,alarm_desc)        
        fp.write('sendmail suss!\n')
    # insert t_server_alarm_log
    for arg in arg_list:
        #fp.write('arg='+arg+',')
        alarm_type = int(arg[0])
        service_type = int(arg[1])
        service_id = int(arg[2])
        alarm_desc = '联通机房检测到异常:\n' + arg[3].decode('utf-8').encode('utf-8')
 
        t_server_alarm_log = "INSERT INTO t_service_alarm_log(service_id,server_type,service_ip,alarm_type,alarm_desc,alarm_time,store_time) \
        VALUES (%d,%d,'%s',%d,'%s',%d,%d)" % (service_id,service_type,srv_ip,alarm_type,alarm_desc,cur_time,cur_time)
        cur.execute(t_server_alarm_log)
        fp.write('insert t_service_alarm_log suss!\n')
        # commit insert op
        conn.commit()

        # send warning mail
        send_mail(g_server,g_fro,mail_addr,g_subject,alarm_desc)        
        fp.write('send_mail suss!\n')
    # close mysql server
    cur.close()
    conn.close()

    # send sms
    for mobile in mobilelist:
        msg_list = [mobile,g_subject]
        msg = ','.join(msg_list)
        send_sms(mobile,msg)

    fp.write('send sms suss!\n')
    fp.close()

if __name__ == '__main__':
    main()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档