如何在Zabbix关联的Python邮件脚本中使用宏而非硬编码邮箱
适配Zabbix宏的Python多格式邮件发送脚本方案
嘿,我完全懂你的需求——你要写个Python脚本生成HTML+纯文本格式的邮件,还得适配Zabbix的各种宏,不能硬编码邮箱和告警内容对吧?刚好我之前做过Zabbix告警的集成,给你捋个靠谱的方案:
核心逻辑
Zabbix调用外部脚本时,会把{ALERT.SENDTO}(收件人邮箱)、{ALERT.SUBJECT}(邮件主题)这类宏作为命令行参数或者环境变量传递给脚本,我们只需要动态读取这些值就行,完全不用硬编码固定内容。
1. 读取Zabbix传入的宏参数
Zabbix通常会把所需的宏作为命令行参数传给脚本,我们用sys.argv就能轻松获取:
import sys import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 从命令行获取Zabbix传入的参数 # 对应Zabbix调用脚本的格式:python mail_script.py {ALERT.SENDTO} {ALERT.SUBJECT} {ALERT.MESSAGE} recipient_email = sys.argv[1] email_subject = sys.argv[2] alert_detail = sys.argv[3]
2. 构建双格式邮件内容
要同时支持HTML和纯文本,我们用MIMEMultipart来包装两个版本的内容——纯文本作为降级选项,HTML可以做针对性美化:
# 创建多部分邮件容器 msg = MIMEMultipart('alternative') msg['From'] = "zabbix-alert@your-company.com" # 发件人可以固定,也用Zabbix宏传入 msg['To'] = recipient_email msg['Subject'] = email_subject # 纯文本版本(兼容不支持HTML的邮箱) plain_content = f"Zabbix监控告警通知:\n\n{alert_detail}" plain_part = MIMEText(plain_content, 'plain') # HTML版本(可以针对打印机告警做样式优化) html_content = f""" <html> <body> <h2 style="color:#dc3545;">⚠️ Zabbix监控告警</h2> <p><strong>告警详情:</strong></p> <div style="padding:10px; border-left:4px solid #dc3545; background:#f8f9fa;"> {alert_detail} </div> <p style="margin-top:20px; color:#6c757d;">此邮件由Zabbix自动发送,请勿直接回复</p> </body> </html> """ html_part = MIMEText(html_content, 'html') # 将两个版本添加到邮件容器 msg.attach(plain_part) msg.attach(html_part)
3. 通过SMTP发送邮件
最后用SMTP客户端发送,建议把SMTP配置(服务器、端口、密码)放在环境变量里,避免硬编码敏感信息:
# 从环境变量读取SMTP配置(更安全灵活) smtp_server = os.getenv("ZABBIX_SMTP_SERVER", "smtp.your-company.com") smtp_port = int(os.getenv("ZABBIX_SMTP_PORT", 587)) smtp_user = os.getenv("ZABBIX_SMTP_USER", "zabbix-alert@your-company.com") smtp_pass = os.getenv("ZABBIX_SMTP_PASS") # 发送邮件 try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() # 启用TLS加密 server.login(smtp_user, smtp_pass) server.sendmail(smtp_user, recipient_email, msg.as_string()) print("告警邮件发送成功") except Exception as e: print(f"邮件发送失败:{str(e)}") sys.exit(1)
4. Zabbix端的配置步骤
在Zabbix的「告警媒介类型」里,设置脚本的调用命令为:
python3 /opt/zabbix/scripts/mail_script.py "{ALERT.SENDTO}" "{ALERT.SUBJECT}" "{ALERT.MESSAGE}"
这样Zabbix就会把对应的宏值动态传递给脚本了——比如打印机墨粉告警时,{ALERT.MESSAGE}里会包含你在告警模板中设置的打印机型号、墨粉剩余量等信息。
额外优化建议
- 如果你需要单独获取某个特定宏(比如打印机型号
{HOST.NAME}),可以在Zabbix调用脚本时多传一个参数,脚本里用sys.argv[4]读取。 - 可以添加日志功能,把发送记录写到
/var/log/zabbix/mail_script.log里,方便排查发送失败的问题。 - 敏感信息比如SMTP密码,建议在Zabbix的「全局宏」里定义,然后在脚本中通过环境变量读取。
内容的提问来源于stack exchange,提问作者Melanchole
相关产品推荐
相关产品推荐

