`)
+ beginHTMLMail(&builder, "证书管理通知")
builder.WriteString(`
` + escapeHTML(content.status) + `
`)
- builder.WriteString(`
` + escapeHTML(content.statusSummary) + `
`)
- builder.WriteString(`
` + escapeHTML(content.domain) + `
`)
+ builder.WriteString(`
` + escapeHTML(content.statusSummary) + `
`)
+ builder.WriteString(`
` + escapeHTML(content.domain) + `
`)
- builder.WriteString(`
`)
+ builder.WriteString(``)
writeHTMLField(&builder, "任务类型", content.title)
writeHTMLField(&builder, "域名", content.domain)
if len(content.domains) > 0 {
@@ -131,31 +128,42 @@ func buildHTMLMail(content mailContent) string {
builder.WriteString(`
`)
if content.problem != "" {
- builder.WriteString(`问题概述
` + escapeHTML(content.problem) + `
`)
+ builder.WriteString(`问题概述
` + escapeHTML(content.problem) + `
`)
}
if content.hasDeployment {
- builder.WriteString(`部署概况
` + escapeHTML(deploymentSummary(content.deployment)) + `
`)
+ builder.WriteString(`部署概况
` + escapeHTML(deploymentSummary(content.deployment)) + `
`)
}
if content.recoveryWarning != "" {
- builder.WriteString(`` + escapeHTML(content.recoveryWarning) + `
`)
+ builder.WriteString(`` + escapeHTML(content.recoveryWarning) + `
`)
}
if content.includeDeployment && len(content.deployment.Results) > 0 {
- builder.WriteString(`处理结果
`)
+ builder.WriteString(`
处理结果
`)
for _, result := range content.deployment.Results {
color := resultColor(result.Status)
- builder.WriteString(`
` + escapeHTML(result.Server) + ` · ` + escapeHTML(resultStatus(result.Status)) + `` + escapeHTML(resultSummary(result.Message)) + `
`)
+ builder.WriteString(`
` + escapeHTML(result.Server) + ` · ` + escapeHTML(resultStatus(result.Status)) + `` + escapeHTML(resultSummary(result.Message)) + `
`)
}
builder.WriteString(`
`)
}
if content.managementURL != "" {
- builder.WriteString(`
`)
+ builder.WriteString(`
`)
}
- builder.WriteString(`
此邮件由 Scert 自动发送,请勿直接回复。
`)
+ endHTMLMail(&builder)
return builder.String()
}
+func beginHTMLMail(builder *strings.Builder, title string) {
+ builder.WriteString(``)
+ builder.WriteString(``)
+ builder.WriteString(`
` + escapeHTML(title) + `
`)
+ builder.WriteString(`
`)
+}
+
+func endHTMLMail(builder *strings.Builder) {
+ builder.WriteString(`
此邮件由 Scert 自动发送,请勿直接回复。
`)
+}
+
func writeHTMLField(builder *strings.Builder, label, value string) {
- builder.WriteString(`| ` + escapeHTML(label) + ` | ` + escapeHTML(value) + ` |
`)
+ builder.WriteString(`| ` + escapeHTML(label) + ` | ` + escapeHTML(value) + ` |
`)
}
func mailStatusColor(status string) string {
diff --git a/backend/internal/notification/template_safety_test.go b/backend/internal/notification/template_safety_test.go
index 3cb3db1..798bc28 100644
--- a/backend/internal/notification/template_safety_test.go
+++ b/backend/internal/notification/template_safety_test.go
@@ -126,9 +126,11 @@ func TestAllMailTemplatesHaveValidBodyStyles(t *testing.T) {
t.Fatal(err)
}
assertMailBodyStyle(t, payload.HTML)
+ assertReferenceMailStyle(t, payload.HTML)
}
}
assertMailBodyStyle(t, buildSecurityHTML("01234567"))
+ assertReferenceMailStyle(t, buildSecurityHTML("01234567"))
if strings.Contains(buildSecurityHTML(``), "