zabbix告警邮件 发表于 2018-06-05 | 更新于 2019-05-01 | 分类于 Zabbix 本文字数: 17k | 阅读时长 ≈ 15 分钟 新增功能 对邮件内容进行了重新定制 增加了监控告警图表展示 #!/usr/bin/env python#coding=utf-8import jsonimport requestsimport datetimeimport osimport smtplibimport sysimport timefrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.application import MIMEApplicationfrom email.mime.image import MIMEImage #zabbix接口地址、登录地址、图片地址zabbix_url = 'http://njzabbix.local.genewiz.com/api_jsonrpc.php'login_url = 'http://njzabbix.local.genewiz.com/index.php'zabbix_header = { "Content-Type":"application/json-rpc"} #获取tokendef GetToken(): data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "xxxxxxxx", "password": "xxxxxxxx" }, "id": 1, "auth": None } request = requests.post(url=zabbix_url, headers=zabbix_header, data=json.dumps(data)) token = json.loads(request.content)["result"] return token #获取graphitem iddef GetGraphID(itemids): data = { "jsonrpc": "2.0", "method": "graphitem.get", "params": { "output": "extend", "itemids": itemids }, "auth": GetToken(), "id": 1 } request = requests.post(url=zabbix_url, headers=zabbix_header, data=json.dumps(data)) if json.loads(request.content)['result']: return json.loads(request.content)['result'][0]['graphid'] else: return False def PicSave(ip,graphid): #新建以当天日期为名的文件夹保存图片 today = datetime.datetime.now().date().strftime('%Y%m%d') pic_save_path_dir= os.path.join('/opt/genewiznj/zabbix/img/',today ) if not os.path.exists(pic_save_path_dir): os.makedirs(pic_save_path_dir) pic_name = ip + '-' + graphid +'.png' pic_save_path = os.path.join(pic_save_path_dir,pic_name) #定义graph的starttime参数,从前一天的9:00开始 yesterday = (datetime.datetime.now()-datetime.timedelta(days=1)) yesterday9 = datetime.datetime(yesterday.year,yesterday.month,yesterday.day,9).strftime('%Y%m%d%H%M%S') graph_args = { "graphid":graphid, "width":800, "stime":yesterday9, "isNow": 1, "period":7200 #定义时长,取1天的数据,单位s } print graph_args graph_url = 'http://njzabbix.local.genewiz.com/chart2.php' client = requests.session() data = { "name": 'jianhu.yong', "password": 'Welcome2017', "autologin": 1, "enter": "Sign in" } time.sleep(10) r=client.post(url=login_url,data=data) r=client.get(url=graph_url,params=graph_args) with open(pic_save_path,'wb') as f: f.write(r.content) #f.flush() f.close() return pic_save_path def SendMail(username, password, from_addr, to_addrs, message): try: server = smtplib.SMTP('smtp.partner.outlook.cn', '587') server.ehlo() server.starttls() server.ehlo() server.login(username, password) server.sendmail(from_addr,to_addrs,message.as_string()) server.quit() return True except Exception as e: print e return False if __name__ == '__main__': if len(sys.argv) != 4: sys.exit('Usage:%s test@examplie.com mail_subject mail_content' % sys.argv[0]) else: username = 'jianhu.yong@genewiz.com.cn' password = 'Welcome2017' from_addr = 'jianhu.yong@genewiz.com.cn' mail_msg = sys.argv[3].strip().split('\r\n') mail_dic = {} for i in mail_msg: temp = i.split(':') if len(temp)==2: mail_dic[temp[0]] = temp[-1] else: mail_dic[temp[0]] = ':'.join(temp[1:]) print mail_dic if mail_dic.has_key('Problem Time'): key = 'Problem Time' else: key = 'Recovery Time' graphitem_id = GetGraphID('{0}'.format(mail_dic['Problem Item ID'])) if graphitem_id: pic_save_path = PicSave(mail_dic['Problem Host IP'],graphitem_id) mail_msg = ''' <html lang="en"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Document</title> <style type="text/css"> .bg { /*width: 600px;*/ } .bg table { /*width: 600px;*/ font: 12px microsoft yahei; border-collapse: collapse; border: 1px solid #B9B4B1; text-align: left; } .bg table td { border: 1px solid #B9B4B1; text-align: left; height: 28px; padding-left: 10px; padding-right: 10px; } .bg .r1 { background: #4285F4; color: #F8FBFD; } ul{ padding:0; margin:0; } ul li{ list-style: none; } ul li a{ text-decoration: none; display: inline-block; width: 400px; height: 20px; color: #4285F4; font:12px/20px microsoft yahei; } p{ color: red; font:12px/20px microsoft yahei; } </style> </head> <body> <h4 style="border-bottom:1px solid black;padding-bottom: 10px">1.告警详情</h4> <div class="bg"> <table> <tr> <td class="r1">%s</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Host</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Host IP</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Item ID</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Name</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Key</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Value</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Level</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Trigger Name</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Trigger Rule</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Latest Collection Value</td> <td style="color: red">%s</td> </tr> <td class="r1">Original Problem ID</td> <td>%s</td> </tr> </table> </div> <h4 style="border-bottom:1px solid black;padding-bottom: 10px">2.监控图表</h4> <img src="cid:image1"> </body> </html> ''' % ( key, mail_dic[key], mail_dic['Problem Host'], mail_dic['Problem Host IP'], mail_dic['Problem Item ID'], mail_dic['Problem Name'], mail_dic['Problem Key'], mail_dic['Problem Value'], mail_dic['Problem Level'], mail_dic['Problem Trigger Name'], mail_dic['Problem Trigger Rule'], mail_dic['Latest Collection Value'], mail_dic['Original Problem ID'] ) message = MIMEText(mail_msg, 'html', 'utf-8') msg=MIMEMultipart('related') to_addrs = [] for i in sys.argv[1].split(','): to_addrs.append(i) msg['From'] = from_addr if len(to_addrs) == 1: msg['To'] = to_addrs[0] else: msg['To'] = ','.join(to_addrs) subject = sys.argv[2] msg['Subject'] = subject msgAlternative = MIMEMultipart('alternative') msg.attach(msgAlternative) msgAlternative.attach(message) fp=open(pic_save_path,'rb') image=MIMEImage(fp.read()) fp.close() image.add_header('Content-ID','<image1>') msg.attach(image) if SendMail(username, password, from_addr, to_addrs, msg) == True: print "Email successfully sent to", to_addrs else: print "Email not sent to", to_addrs else: mail_msg = ''' <html lang="en"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Document</title> <style type="text/css"> .bg { /*width: 600px;*/ } .bg table { /*width: 600px;*/ font: 12px microsoft yahei; border-collapse: collapse; border: 1px solid #B9B4B1; text-align: left; } .bg table td { border: 1px solid #B9B4B1; text-align: left; height: 28px; padding-left: 10px; padding-right: 10px; } .bg .r1 { background: #4285F4; color: #F8FBFD; } ul{ padding:0; margin:0; } ul li{ list-style: none; } ul li a{ text-decoration: none; display: inline-block; width: 400px; height: 20px; color: #4285F4; font:12px/20px microsoft yahei; } p{ color: red; font:12px/20px microsoft yahei; } </style> </head> <body> <h4 style="border-bottom:1px solid black;padding-bottom: 10px">1.告警详情</h4> <div class="bg"> <table> <tr> <td class="r1">%s</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Host</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Host IP</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Item ID</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Name</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Key</td> <td>%s</td> </tr> <tr> <td class="r1">Problem Value</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Level</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Trigger Name</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Problem Trigger Rule</td> <td style="color: red">%s</td> </tr> <tr> <td class="r1">Latest Collection Value</td> <td style="color: red">%s</td> </tr> <td class="r1">Original Problem ID</td> <td>%s</td> </tr> </table> </div> </body> </html> ''' % ( key, mail_dic[key], mail_dic['Problem Host'], mail_dic['Problem Host IP'], mail_dic['Problem Item ID'], mail_dic['Problem Name'], mail_dic['Problem Key'], mail_dic['Problem Value'], mail_dic['Problem Level'], mail_dic['Problem Trigger Name'], mail_dic['Problem Trigger Rule'], mail_dic['Latest Collection Value'], mail_dic['Original Problem ID'] ) message = MIMEText(mail_msg, 'html', 'utf-8') to_addrs = [] for i in sys.argv[1].split(','): to_addrs.append(i) message['From'] = from_addr if len(to_addrs) == 1: message['To'] = to_addrs[0] else: message['To'] = ','.join(to_addrs) subject = sys.argv[2] message['Subject'] = subject if SendMail(username, password, from_addr, to_addrs, message) == True: print "Email successfully sent to", to_addrs else: print "Email not sent to", to_addr