
整理一下最近给内部监控系统加邮件告警通道的做法。场景:Prometheus 告警、定时任务失败、业务异常这类事件,需要按级别发邮件给值班人。没有自建 SMTP,走的是 HTTP 接口,全程可复现。
监控系统发邮件和业务发邮件不太一样:频率不定(故障时可能连续触发)、内容是机器生成的纯文本、对送达时效敏感。自建 SMTP 这三点都不好伺候——频率高容易被服务商限流,机器文本容易进垃圾箱,进没进垃圾箱还无从查起。所以这次直接把发送层外包给现成接口,监控侧只负责组装告警内容。
1. 建告警模板。 微信扫码登录后进「邮件模板」,新建一个模板,正文示例:
【${level}】${service} 告警
主机:${host}
详情:${detail}变量名自己定义,调用时按模板详情里列出的变量传参即可。保存后复制模板编码(形如 Vf7Jp2sD9xL),编码即调用凭证,无需 token 或签名。
2. 告警侧发请求。 模板编码拼在接口路径末尾:
import requests
ALERT_URL = 'https://push.spug.cc/mail/Vf7Jp2sD9xL'
def send_alert(level, service, host, detail, receivers):
body = {
'to': ','.join(receivers[:10]), # 最多 10 个收件人,英文逗号分隔
'level': level,
'service': service,
'host': host,
'detail': detail,
}
try:
r = requests.post(ALERT_URL, json=body, timeout=5)
return r.json().get('request_id')
except requests.RequestException:
return None # 告警通道失败不应影响主流程,落日志即可接到 Alertmanager 的 webhook 或者定时任务的异常分支里都是几行的事。
两个工程细节:
code: 200 只代表请求入库,邮件异步发送。把返回的 request_id 和告警事件一起落库,出现"没收到告警"的争议时拿它去推送日志查状态。service+host 做个几分钟的去重窗口,避免把值班人的邮箱打爆——这层逻辑在你自己代码里做,接口只管发。模板编码等同凭证:只在服务端调用,不进前端、不进公开仓库;服务器出口 IP 固定的话在平台配置 IP 白名单;怀疑泄露立即重置编码,旧编码即刻失效。
整套接下来,监控系统里没有一行 SMTP 配置,告警链路也能查能审计。用的是 Spug 邮件推送,控制台在 sms.spug.cc,想复现的可以去试试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。