巡检脚本的告警邮件,从 mailx 换成了 HTTP 接口

服务器上有几个跑了很多年的巡检脚本:磁盘超过阈值发邮件、备份失败发邮件、证书快到期发邮件。发邮件这步一直用的 mailx 加一个免费邮箱的 SMTP,能用,但毛病不少。

mailx 的几个老毛病

最烦的是送达不稳定。同一个脚本,有时候邮件秒到,有时候进垃圾箱,有时候干脆被拒收——免费邮箱的 SMTP 对这种机器发的纯文本邮件本来就不友好,发件频率稍微高一点还会被临时限制。

其次是排查难。mailx 返回 0 不代表对方收到了,中间经过哪些环节完全是黑盒,领导问"昨晚磁盘告警为什么没人收到",只能回答"脚本是跑了的"。

还有个小问题:SMTP 密码明文写在脚本或者配置里,安全审计每次都被点名。

改造:把发送换成一个 HTTP 请求

后来把发送这一段整个换掉了,用的是 Spug 的邮件推送接口。改造量很小:原来调 mailx 的地方换成一条 curl。

先在平台上建了个告警模板(微信扫码登录,进「邮件模板」新建),正文大概是"${host} 于 ${time} 触发告警:${event}",变量自己定。建完复制模板编码,形如 Tz5Km8wQ3rN,这个编码就是调用凭证,不需要再配 token。

然后巡检脚本里这样发:

#!/bin/bash
USAGE=$(df -h / | awk 'NR==2 {print int($5)}')
if [ "$USAGE" -gt 85 ]; then
  curl -s -d "{\"to\": \"ops@example.com\", \"host\": \"$(hostname)\", \"time\": \"$(date '+%H:%M')\", \"event\": \"磁盘使用率 ${USAGE}%\"}" \
    https://push.spug.cc/mail/Tz5Km8wQ3rN
fi

收件人多个用英文逗号分隔(最多 10 个),刚好把值班的几个人都带上。

换完之后的差别

送达率没再出过问题,机器发的告警也不进垃圾箱了。返回里有个 request_id,我顺手用 logger 打进了 syslog——再有人问告警发没发到,拿 request_id 去推送日志一查就有答案,这点比 mailx 强太多。

要注意返回 code: 200 只表示请求入库成功,邮件是异步发的,真要确认送达状态还是得查日志。

另外模板编码等于凭证,别提交到公开仓库。我们服务器出口 IP 固定,就在平台上配了 IP 白名单,只有白名单内的机器能调,脚本里也不用再藏 SMTP 密码了。

改造前后脚本行数基本没变,但告警这条链路终于不用再操心了。接口是 Spug 邮件推送的,sms.spug.cc,有同样困扰的可以看看。

posted @ 2026-07-08 16:41  外滩运维专家  阅读(1)  评论(0)    收藏  举报