You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

异常现象

  1. 内容挤在一行:
Project: PPPPPPPPPPPPPPPPP Target : TTTTTTTTTTTTTTTTT Version: VVVVVVVVVVVVVVVVV URL: UUUUUUUUUUUUUUUUUUUU

Best regards,
Devops Team
  1. 添加换行符后每行多空一行:
Project: PPPPPPPPPPPPPPPPP

Target : TTTTTTTTTTTTTTTTT

Version: VVVVVVVVVVVVVVVVV

URL: UUUUUUUUUUUUUUUUUUUU

Best regards,
Devops Team

解决方案核心

SMTP协议要求邮件内容的换行符必须是\r\n(CRLF),而非操作系统默认的\n(LF)。部分邮件客户端对LF换行识别异常,要么当成空格,要么错误解析为额外空行。

修改点:

  1. 移除结构体字段中手动添加的换行符,避免重复换行
  2. 在模板渲染完成后,将所有\n替换为\r\n,确保符合SMTP协议要求

修改后的代码通过strings.ReplaceAll(tpl.String(), "\n", "\r\n")完成换行符转换,邮件内容的换行就能被所有邮件客户端正确识别,达到每行单独显示的理想效果。

内容的提问来源于stack exchange,提问作者Ricky V.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:50:17