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

Zabbix自定义Python短信告警脚本参数未替换问题求助

问题排查与修复

核心问题分析

你的Python脚本存在多处参数索引错误、逻辑误用,导致Zabbix传递的实际值没被正确读取:

  • sys.argv索引错误:sys.argv[0]是脚本自身路径,不是你配置的{ALERT.SENDTO}手机号;你定义的severity = sys.argv[3]对应Zabbix参数里的{ALERT.SUBJECT},而非{EVENT.SEVERITY}。
  • 短信内容未使用正确参数:你配置了5个Zabbix参数,但脚本里短信内容只取了前两个,且未关联到你需要的告警字段;同时定义的hostname、eventname、severity变量完全没用到。
  • SMPP消息分段逻辑错误:smpplib.gsm.make_parts(u'')传入空字符串,导致生成的parts为空,理论上不会进入短信发送循环——你能收到占位符,说明测试时可能手动改了,但正式逻辑不成立。

修正后的脚本

import logging
import sys
import smpplib.gsm
import smpplib.client
import smpplib.consts

# 读取Zabbix传递的参数:对应配置的5个参数,sys.argv从0开始计数
hostname = sys.argv[1]       # {HOST.NAME}
action_id = sys.argv[2]      # {ACTION.ID}
dest_phone = sys.argv[3]     # {ALERT.SENDTO}
alert_subject = sys.argv[4]  # {ALERT.SUBJECT}
severity = sys.argv[5]       # {EVENT.SEVERITY}

# 配置日志(可选,调试用)
logging.basicConfig(level='DEBUG')

# 构造要发送的短信内容,按需调整格式
message_content = f"告警通知:主机{hostname},事件ID{action_id},级别{severity},内容:{alert_subject}"

# 对短信内容进行分段处理(适配长短信)
parts, encoding_flag, msg_type_flag = smpplib.gsm.make_parts(message_content)

# 初始化SMPP客户端
client = smpplib.client.Client('smpp server ip', example_port)

# 发送成功回调
client.set_message_sent_handler(
    lambda pdu: sys.stdout.write(f'sent {pdu.sequence} {pdu.message_id}\n'))

# 处理送达回执
def handle_deliver_sm(pdu):
    sys.stdout.write(f'delivered {pdu.receipted_message_id}\n')
    return 0  # cmd status for deliver_sm_resp

client.set_message_received_handler(lambda pdu: handle_deliver_sm(pdu))

# 连接并绑定SMPP服务
client.connect()
client.bind_transceiver(system_id='Example', password='Example@2023')

# 发送分段后的短信
for part in parts:
    pdu = client.send_message(
        source_addr_ton=smpplib.consts.SMPP_TON_ALNUM,
        source_addr_npi=smpplib.consts.SMPP_NPI_UNK,
        source_addr='27840001019',
        dest_addr_ton=smpplib.consts.SMPP_TON_INTL,
        dest_addr_npi=smpplib.consts.SMPP_NPI_ISDN,
        destination_addr=dest_phone,
        short_message=part,
        data_coding=encoding_flag,
        esm_class=msg_type_flag,
        registered_delivery=True,
    )
    print(pdu.sequence)

# 监听回执(可选,若不需要可注释或移除)
client.listen()

额外验证步骤

  1. 手动测试脚本:在命令行模拟Zabbix传参,执行:
python your_script.py "测试主机" "123" "138xxxxxxx" "CPU使用率过高" "严重"

确认能收到正确内容的短信。
2. 检查Zabbix动作配置:确保告警媒介的参数顺序和脚本读取的sys.argv索引完全对应,不要遗漏或错位。

内容的提问来源于stack exchange,提问作者King Carter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:30:01