Go语言模板发送邮件正文格式异常问题求助
Go邮件模板排版异常解决方案
问题描述
我用Go语言编写了通过模板发送邮件的代码,目的是便于后续修改模板以适配更多变量并提升可读性。当前期望邮件正文每行单独显示Project、Target、Version、URL信息,但实际运行时要么这些内容挤在同一行,要么每行间多空一行,调整换行符也无法达到理想排版。
代码实现
package main import ( "bytes" "strings" "text/template" "net/smtp" "log" ) type Email_struct struct { Status string App string Project string TargetEnv string AppVersion string Url string } func SendmaiL(emailTo string, e Email_struct) bool { from := "noreply@domain.com" to := []string{ emailTo, } var tmplFile = "email.tmpl" tmpl, err := template.New(tmplFile).ParseFiles(tmplFile) if err != nil { panic(err) } var tpl bytes.Buffer if err := tmpl.Execute(&tpl, e); err != nil { panic(err) } // 将LF换行替换为SMTP要求的CRLF换行 messageStr := strings.ReplaceAll(tpl.String(), "\n", "\r\n") message := []byte(messageStr) log.Print(string(message[:])) // print // Sending email. errs := smtp.SendMail("mail.domain.com:25", nil, from, to, message) if errs != nil { log.Println(errs) return false } return true } func main() { em := Email_struct{} em.Status = "Synced" app := "pipeline-gitops-notification-sit" em.App = app em.Project = app GitopsFolder := "gitops/sit" extractTargetEnv := strings.Split(GitopsFolder, "/") em.TargetEnv = extractTargetEnv[1] mes := "Manifest-63db30e: qa-0.0.110 by user@domain.com" extractVersion1 := strings.Split(mes, "-") extractVersion2 := strings.Split(extractVersion1[2], ".") extractVersion3 := strings.Split(extractVersion2[2], " ") em.AppVersion = extractVersion2[0]+"."+extractVersion2[1]+"."+extractVersion3[0] RepoUrl := "https://cd.toronto.ca:6443/devops/pipeline/gitops-notification.git" em.Url = RepoUrl success := SendmaiL("user@domain.com", em) if success { log.Println("Email SUCCESS to sent!") } else { log.Println("Email FAILED to send!") } }
模板文件(email.tmpl)
Subject: [{{ .Status }}] app {{ .App }} has been synced by argoCD Project: {{ .Project }} Target : {{ .TargetEnv }} Version: {{ .AppVersion }} URL: {{ .Url }} Best regards, Devops Team
异常现象
- 内容挤在一行:
Project: PPPPPPPPPPPPPPPPP Target : TTTTTTTTTTTTTTTTT Version: VVVVVVVVVVVVVVVVV URL: UUUUUUUUUUUUUUUUUUUU Best regards, Devops Team
- 添加换行符后每行多空一行:
Project: PPPPPPPPPPPPPPPPP Target : TTTTTTTTTTTTTTTTT Version: VVVVVVVVVVVVVVVVV URL: UUUUUUUUUUUUUUUUUUUU Best regards, Devops Team
解决方案核心
SMTP协议要求邮件内容的换行符必须是\r\n(CRLF),而非操作系统默认的\n(LF)。部分邮件客户端对LF换行识别异常,要么当成空格,要么错误解析为额外空行。
修改点:
- 移除结构体字段中手动添加的换行符,避免重复换行
- 在模板渲染完成后,将所有
\n替换为\r\n,确保符合SMTP协议要求
修改后的代码通过strings.ReplaceAll(tpl.String(), "\n", "\r\n")完成换行符转换,邮件内容的换行就能被所有邮件客户端正确识别,达到每行单独显示的理想效果。
内容的提问来源于stack exchange,提问作者Ricky V.
相关产品推荐
相关产品推荐

