如何在发送至Gmail的邮件告警中正确显示换行符?
解决Prometheus告警在Gmail中换行符失效的问题
嘿,我刚好碰到过一模一样的问题!你这情况是因为Prometheus Alertmanager和Gmail对文本格式的处理方式没对上,咱们一步步来解决:
问题根源
你用\n或者<br>没效果,大概率是两个原因:
- 你在告警规则里的YAML多行写法没用到正确的块标量语法,导致换行被YAML解析成了空格;
- Alertmanager默认发的是纯文本邮件,
<br>标签在纯文本里就是普通字符串,根本不会被Gmail当成换行解析;而\n可能被Alertmanager转义成了字面量,所以直接显示出来了。
解决方案1:用YAML块标量实现纯文本换行
这是最省心的办法,不用改Alertmanager的模板配置,只要调整告警规则里的description写法就行。用YAML的|符号来定义多行字符串,它会完整保留你的换行:
alert: KubernetesPodImagePullBackOff expr: kube_pod_container_status_waiting_reason{reason=~"ContainerCreating|CrashLoopBackOff|ErrImagePull|ImagePullBackOff"} > 0 for: 1s labels: severity: warning annotations: summary: "Kubernetes pod crash looping (instance {{ $labels.instance }})" description: | Pod {{ $labels.pod }} is crash looping VALUE = {{ $value }} LABELS: {{ $labels }}
注意这里的|后面的每一行都要保持一致的缩进(和description的冒号后对齐就行),这样YAML会把每一行的换行完整保留,Alertmanager发送纯文本邮件时,Gmail就能识别这些换行并正常显示了。
解决方案2:配置Alertmanager发送HTML邮件用<br>换行
如果非要用HTML标签来控制格式,就得改Alertmanager的邮件模板和接收器配置:
- 修改Alertmanager接收器配置,指定发送HTML格式的邮件:
receivers: - name: 'gmail-alerts' email_configs: - to: '你的Gmail邮箱地址' html: '{{ template "custom-email.html" . }}' # 指定用自定义HTML模板
- 创建自定义HTML模板文件(比如
custom-email.html),把注解里的\n替换成<br>,并确保标签不被转义:
{{ define "custom-email.html" }} <html> <head> <title>{{ .CommonLabels.alertname }}</title> </head> <body> <h2>{{ .CommonAnnotations.summary }}</h2> <!-- 把\n替换成<br>,并用safeHTML确保标签生效 --> <p>{{ replace .CommonAnnotations.description "\n" "<br>" | safeHTML }}</p> </body> </html> {{ end }}
- 在Alertmanager配置里加载模板文件:
templates: - '/etc/alertmanager/templates/custom-email.html' # 替换成你的模板路径
这样配置后,你在告警规则里写的\n会被模板转换成<br>,Gmail收到HTML邮件后就会正确解析换行。
为什么之前的方法无效?
- 你之前的YAML多行写法没加
|,YAML会自动把多行内容合并成一行空格,所以换行没了; - 直接用
<br>但没开HTML邮件模式,Gmail把它当成了普通字符串,自然不会换行。
选其中一个方案测试下,应该就能解决Gmail里换行被原样打印的问题了!
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

