zoukankan      html  css  js  c++  java
  • zabbix 5.0 邮件发送带告警图

    代码如下:

    #!/usr/bin/python
    #coding=utf-8
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.image import MIMEImage
    import smtplib,sys,os,time,re,requests
    from smtplib import SMTP
    
    user="Admin"   #定义zabbix用户名
    password='zabbixmima'    #定义zabbix用户密码graph_path='/usr/lib/zabbix/alertscripts/graph'   #定义图片存储路径
    graph_url='http://localhost/chart.php'     #定义图表的url
    loginurl="http://localhost/index.php"          #定义登录的url
    host='monitor-tc.maetimes.jp'
    to_email=sys.argv[1]    #传入的第一个参数为收件人邮箱
    subject=sys.argv[2]  #传入的第二个参数为邮件主题
    #subject=subject.decode('utf-8')
    smtp_host = 'smtp.xxx.com'  #定义smtp主机地址
    from_email = 'monitor@xxx.com'     #定义发件人地址
    mail_pass = '邮箱密码'       #发件人邮箱校验码
    
    def get_itemid():
        #获取报警的itemid
        itemid = re.search(r'ITEMID:(d+)',sys.argv[3]).group(1)
        #print(itmeid)
        return itemid
    def get_graph(itemid):
        #获取报警的图表并保存
        session=requests.Session()   #创建一个session会话
        try:
            loginheaders={
            "Host":host,
            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
            }
            #定义请求消息头
            payload = {
            "name":user,
            "password":password,
            "autologin":"1",
            "enter":"Sign in",
            }
            #定义传入的data
            login=session.post(url=loginurl,headers=loginheaders,data=payload)
            #进行登录
            graph_params={
                "from" :"now-10m",
                "to" : "now",
                "itemids[0]" : itemid,   #zabbix5.0 此处是php7版本以上,代码有所改动,需要写成列表获取,其他版本itemids即可
                "width" : "400",
            }
            #定义获取图片的参数
            graph_req=session.get(url=graph_url,params=graph_params)
            #发送get请求获取图片数据
            time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
            graph_name='baojing_'+time_tag+'.png'
            #用报警时间来作为图片名进行保存
            graph_name = os.path.join(graph_path, graph_name)
            #使用绝对路径保存图片
            with open(graph_name,'wb') as f:
                f.write(graph_req.content)
                #将获取到的图片数据写入到文件中去
            return graph_name
        except Exception as e:
            print(e)
            return False
    def text_to_html(text):
        #将邮件内容text字段转换成HTML格式
        d=text.splitlines()
        #将邮件内容以每行作为一个列表元素存储在列表中
        html_text=''
        for i in d:
            i='' + i + '<br>'
            html_text+=i + '
    '
        #为列表的每个元素后加上html的换行标签
        return html_text
    
    def send_mail(graph_name):
        #将html和图片封装成邮件进行发送
        msg = MIMEMultipart('related')  #创建内嵌资源的实例
    
        with open(graph_name,'rb') as f:
            #读取图片文件
            graph=MIMEImage(f.read())  #读取图片赋值一个图片对象
        graph.add_header('Content-ID','imgid1')  #为图片对象添加标题字段和值
        text=text_to_html(sys.argv[3])
        html="""
        <html>
          <body>
          %s  <br><img src="cid:imgid1">
          </body>
        </html>
        """ % text
        html=MIMEText(html,'html','utf-8')  #创建HTML格式的邮件体
        msg.attach(html)   #使用attach方法将HTML添加到msg实例中
        msg.attach(graph)  #使用attach方法将图片添加到msg实例中
        msg['Subject'] = subject
        msg['From'] = from_email
        try:
            server=SMTP(smtp_host,"25")   #创建一个smtp对象
            #server.starttls()    #启用安全传输模式
            server.login(from_email,mail_pass)  #邮箱账号登录
            server.sendmail(from_email,to_email,msg.as_string())  #发送邮件
            server.quit()   #断开smtp连接
        except smtplib.SMTPException as a:
            print(a)
    
    def run():
        itemid=get_itemid()
        graph_name=get_graph(itemid)
        send_mail(graph_name)
    if __name__ =='__main__':
        run()

    代码中需要获取zabbix 监控项id即itemids,此处需要在消息中自定义,如下:

    告警主机:{HOST.NAME}
    告警地址:{HOST.IP}
    ITEMID:{ITEM.ID}
    监控项目:{ITEM.NAME}
    监控取值:{ITEM.LASTVALUE}
    告警等级:{TRIGGER.SEVERITY}
    当前状态:{TRIGGER.STATUS}
    告警信息:{TRIGGER.NAME}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    事件ID:{EVENT.ID}

  • 相关阅读:
    Vue.js 样式绑定
    Vue.js 监听属性
    【BZOJ2438】[中山市选2011]杀人游戏 Tarjan
    【BZOJ2150】部落战争 最小流
    【BZOJ4247】挂饰 背包
    【BZOJ2794】[Poi2012]Cloakroom 离线+背包
    【BZOJ1731】[Usaco2005 dec]Layout 排队布局 差分约束
    【BZOJ1058】[ZJOI2007]报表统计 STL
    【BZOJ1449/2895】[JSOI2009]球队收益/球队预算 最小费用最大流
    【BZOJ1280】Emmy卖猪pigs 最大流
  • 原文地址:https://www.cnblogs.com/i1991/p/15141713.html
Copyright © 2011-2022 走看看