You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:12:17