首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >监控告警邮件接入:自定义模板 + 一个 POST 请求

监控告警邮件接入:自定义模板 + 一个 POST 请求

原创
作者头像
外滩首席运维
发布2026-07-08 16:46:04
发布2026-07-08 16:46:04
60
举报

整理一下最近给内部监控系统加邮件告警通道的做法。场景:Prometheus 告警、定时任务失败、业务异常这类事件,需要按级别发邮件给值班人。没有自建 SMTP,走的是 HTTP 接口,全程可复现。

为什么不直接 SMTP

监控系统发邮件和业务发邮件不太一样:频率不定(故障时可能连续触发)、内容是机器生成的纯文本、对送达时效敏感。自建 SMTP 这三点都不好伺候——频率高容易被服务商限流,机器文本容易进垃圾箱,进没进垃圾箱还无从查起。所以这次直接把发送层外包给现成接口,监控侧只负责组装告警内容。

接入步骤

1. 建告警模板。 微信扫码登录后进「邮件模板」,新建一个模板,正文示例:

代码语言:txt
复制
【${level}】${service} 告警
主机:${host}
详情:${detail}

变量名自己定义,调用时按模板详情里列出的变量传参即可。保存后复制模板编码(形如 Vf7Jp2sD9xL),编码即调用凭证,无需 token 或签名。

2. 告警侧发请求。 模板编码拼在接口路径末尾:

代码语言:python
复制
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 或者定时任务的异常分支里都是几行的事。

送达确认与降噪

两个工程细节:

  • 返回 200 ≠ 送达。 接口返回的 code: 200 只代表请求入库,邮件异步发送。把返回的 request_id 和告警事件一起落库,出现"没收到告警"的争议时拿它去推送日志查状态。
  • 做好抑制。 故障风暴时同一告警可能反复触发,发送前按 service+host 做个几分钟的去重窗口,避免把值班人的邮箱打爆——这层逻辑在你自己代码里做,接口只管发。

安全项

模板编码等同凭证:只在服务端调用,不进前端、不进公开仓库;服务器出口 IP 固定的话在平台配置 IP 白名单;怀疑泄露立即重置编码,旧编码即刻失效。

整套接下来,监控系统里没有一行 SMTP 配置,告警链路也能查能审计。用的是 Spug 邮件推送,控制台在 sms.spug.cc,想复现的可以去试试。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么不直接 SMTP
  • 接入步骤
  • 送达确认与降噪
  • 安全项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档