zabbix告警邮件

 新增功能
  • 对邮件内容进行了重新定制
  • 增加了监控告警图表展示
#!/usr/bin/env python
#coding=utf-8
import json
import requests
import datetime
import os
import smtplib
import sys
import time
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from 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"
}

#获取token
def 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 id
def 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
0%