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或更高
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN3ADN1cTZ3AzMjJGMyQWYzAjNykjNlljYhFWM2cjZy8CX2EzLcRDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
要想通過郵件發送報警,可以選擇的解決方法有兩種:自定義郵件報警腳本或者更新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 = '[email protected]'
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
mail_user = '[email protected]'
mail_pass = 'xxxxxxxxxx'
s = smtplib.SMTP("smtp.163.com", 25)
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 [email protected] "測試" 'test'
測試參數為三個,分别為收件人郵箱位址,郵件标題,郵件内容
測試的時候如果出現錯誤提示缺少smtplib,解決方法為使用pip進行安裝:pip install smtplib