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()
额外验证步骤
- 手动测试脚本:在命令行模拟Zabbix传参,执行:
python your_script.py "测试主机" "123" "138xxxxxxx" "CPU使用率过高" "严重"
确认能收到正确内容的短信。
2. 检查Zabbix动作配置:确保告警媒介的参数顺序和脚本读取的sys.argv索引完全对应,不要遗漏或错位。
内容的提问来源于stack exchange,提问作者King Carter
相关产品推荐
相关产品推荐

