由於某些需求,需要每天發送郵件給相關人員,其中包含前一天的zabbix監控圖形,每天登陸並手動發送的話很麻煩。
本着簡單重復的工作交給機器做的原則,寫了個python程序自動獲取圖形並發送。
大致的思路是:
模擬登陸zabbix ---> 找到需要的圖像並下載到本地 --->使用python發送郵件
一、在服務器上模擬登陸zabbix,並且將需要的圖像下載到本地
#!/usr/bin/env python # -*- coding:utf-8 -*- import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import os # 登錄的主頁面 hosturl = 'http://zabbix.example.com/screens.php?elementid=26&sid=fbc2974a32b8dc87' # 根據自己的實際地址填寫 # post數據接收和處理的頁面(我們要向這個頁面發送我們構造的Post數據) posturl = 'http://zabbix.example.com/index.php' # 從數據包中分析出,處理post請求的url # 設置一個cookie處理器,它負責從服務器下載cookie到本地,並且在發送請求時帶上本地的cookie cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) # 打開登錄主頁面(他的目的是從頁面下載cookie,這樣我們在再送post數據時就有cookie了,否則發送不成功) h = urllib2.urlopen(hosturl) # 構造header,一般header至少要包含一下兩項。這兩項是從抓到的包里分析得出的。 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer': '******'} # 構造Post數據,他也是從抓大的包里分析得出的。 postData = { 'name': 'username', # 用戶名 'password': 'passwd', # 密碼 'autologin': 1, 'enter': 'Sign in' } # 需要給Post數據編碼 postData = urllib.urlencode(postData) # 通過urllib2提供的request方法來向指定Url發送我們構造的數據,並完成登錄過程 request = urllib2.Request(posturl, postData, headers) response = urllib2.urlopen(request) text = response.read() def get_graph(host, graphid, period, image_name): path = '/opt/daily_mail/image/' # 保存圖片的地址 #zabbix的圖片的地址的構造 url = "http://%s/chart2.php?graphid=%s&period=%s&width=800&height=100" % (host, graphid, period) img_req = urllib2.Request(url) png = urllib2.urlopen(img_req).read() file = path + image_name + '.png' with open(file,'wb') as f: f.write(png) host = 'zabbix.example.com' // 你的zabbix服務域名 get_graph(host, 1237, 86400, 'cpu_load') get_graph(host, 1239, 86400, 'net_traffic') get_graph(host, 918, 86400, '155_eth0')
二、將圖像下載到本地之后,需要再使用python來自動發送郵件,網上有很多發送郵件的教程
#!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage import data import time mailto_list=['xxx@example.com'] # 收件人列表 mailcc_list=['xxx@example.com'] # 抄送列表 mail_host="smtp.example.com:25" # 郵件服務器 mail_user="username" # 用戶名 mail_pass="passwd" # 密碼 mail_postfix="example.com" # 郵件后綴 html = """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <p> 服務器 CPU user time 的24h截圖<br> <img src="cid:cpu_load" /> </p> <p> 服務器 net outging 的24h截圖<br> <img src="cid:net_traffic" /> </p> <p> 服務器 eth0 24h出口帶寬 的24h截圖<br> <img src="cid:155_eth0" /> </p> """ def send_mail(to_list, cc_list, sub): # 增加圖片 def addimg(src, imgid): fp = open(src, 'rb') msgImage = MIMEImage(fp.read()) fp.close() msgImage.add_header('Content-ID', imgid) return msgImage msg = MIMEMultipart('related') #HTML代碼 msgtext = MIMEText(data.html, "html", "utf-8") msg.attach(msgtext) # 全文件路徑,后者為ID 根據ID在HTML中插入的位置 msg.attach(addimg("/opt/daily_mail/image/cpu_load.png", "cpu_load")) msg.attach(addimg("/opt/daily_mail/image/net_traffic.png", "net_traffic")) msg.attach(addimg("/opt/daily_mail/image/155_eth0.png", "155_eth0")) me = mail_user + "@" + mail_postfix msg['Subject'] = sub msg['From'] = me msg['To'] = ",".join(to_list) msg['Cc'] = ",".join(cc_list) send_to = to_list + cc_list try: server = smtplib.SMTP() server.connect(mail_host) server.login(mail_user, mail_pass) server.sendmail(me, send_to, msg.as_string()) server.close() return True except Exception, e: print str(e) return False if __name__ == '__main__': title = "zabbix監控數據" + time.strftime('%Y%m%d',time.localtime(time.time())) if send_mail(mailto_list, mailcc_list, title): print "發送成功" else: print "發送失敗"
就是這么簡單,發送的樣品就不截圖了
模擬登陸那塊有參照網上博客,太久不記得地址了,如果作者發現請聯系我,我加上引用地址。