zabbix原生的報警媒介類型中,郵件報警是我們常用的方式。當我們在CentOS6上面安裝zabbix3.0並配置郵件報警的時候,在郵件配置正確的前提下,不管觸發器如何觸發,郵件總是發送不出去,但是在CentOS7上面安裝的zabbix3.0卻可以正常發送郵件。究其原因,是因為zabbix3.0對服務器上的libcurl版本有要求(CentOS6.9上的默認curl版本為7.19.7,而CentOS7.2上的默認libcurl版本為7.29.0),zabbix3.0所要求的的版本說明在zabbix3.0的官方文檔上面可以找到
https://www.zabbix.com/documentation/3.0/manual/installation/install,官網指出從zabbix3.0.0以來的libcurl會影響郵件服務器的認證,其版本必須為7.20.0或更高
要想通過郵件發送報警,可以選擇的解決方法有兩種:自定義郵件報警腳本或者升級libcurl版本。后者從理論來講當然可以實現,但是升級版本會由於依賴關系變得復雜,因此可以采取第一種解決方法,通過使用python腳本來發郵件
1、web界面新增報警媒介類型
名稱自定義即可,類型選擇腳本,腳本名稱為所寫的腳本的名稱,這里的python腳本通過qq郵箱來做服務,腳本的三個參數都是zabbix內置變量,分別為:報警收件人:{ALERT.SENDTO},報警標題:{ALERT.SUBJECT},報警內容:{ALERT.MESSAGE},在zabbix中自定義報警媒介的腳本默認存放路徑(yum安裝zabbix)為/usr/lib/zabbix/alertscripts
添加完報警媒介類型后勾選啟用
2、關於腳本
腳本內容不做過多說明,需要了解含義請自行百度,腳本使用的是python語言,在語法上要求較嚴格。 qq郵箱使用了ssl/tls加密465端口,網易163郵箱使用默認方式25端口,因此腳本內容會有一些差別,腳本如下
[root@zabbix alertscripts]# pwd
/usr/lib/zabbix/alertscripts
[root@zabbix alertscripts]# cat mail_qq.py
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_user = '111111111@qq.com'
mail_pass = 'xxxxxxxxxxx'
def send_mail(to_list,subject,content):
me = "zabbix 監控告警平台"+"<"+mail_user+">"
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = me
msg['to'] = to_list
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
s.login(mail_user,mail_pass)
s.sendmail(me,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
mail_user為郵箱地址,mail_pass為郵箱服務商提供的客戶端授權碼,獲得授權碼的方式也可以參考百度,要說明的是目前網易郵箱客戶端授權碼支持自定義,qq郵箱客戶端授權碼不支持自定義,需要生成、這里也附上使用163郵箱的腳本
[root@zabbix alertscripts]# cat mail_163.py
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_user = '1232323232@163.com'
mail_pass = 'xxxxxxxxxx'
def send_mail(to_list,subject,content):
me = "zabbix 監控告警平台"+"<"+mail_user+">"
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = me
msg['to'] = to_list
try:
s = smtplib.SMTP("smtp.163.com", 25)
s.login(mail_user,mail_pass)
s.sendmail(me,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
腳本編寫完成之后需要為腳本添加執行權限
[root@zabbix alertscripts]# chmod +x mail_qq.py
3、測試
命令行測試腳本能否成功執行
[root@zabbix alertscripts]# ./mail_qq.py xxx@163.com "測試" 'test'
測試參數為三個,分別為收件人郵箱地址,郵件標題,郵件內容
測試的時候如果出現錯誤提示缺少smtplib,解決方法為使用pip進行安裝:pip install smtplib
測試完成了就可以通過zabbix進行觸發報警了