• 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}

  • 相关阅读:
    跨域
    关于DEDECMS自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案
    js复制文本
    dedecms 织梦显示时间格式
    基本特效:饿了么丝滑无缝过度搜索栏的实现
    2016-wing的年度总结
    这交互炸了(四) :一分钟让你拥有微信拖拽透明返回PhotoView
    这交互炸了(三):闪屏页是像云一样消失的
    这交互炸了(二):爱范儿是如何让详情页缩小为横向列表的
    这交互炸了:饿了么是怎么让Image变成详情页的
  • 原文地址:https://www.cnblogs.com/i1991/p/15141713.html
Copyright © 2020-2023  润新知