Golang在HTML模板中处理发送者名称地址邮件的方法

Golang在HTML模板中处理发送者名称地址邮件的方法 大家好,

我需要在我的HTML模板文件中设置发件人名称,格式为“来自 test@mail.com”,并使用“ParseFile”函数进行解析(这是工作流程的要求,并非我个人编写的代码)。

但是,当我在HTML文件中使用这种格式:“来自 test@mail.com”时,它无法正常工作。 有人能告诉我是否有特定的语法要求吗?

非常感谢。

5 回复

“” From test@mail.com"

引号看起来很奇怪。你确定要这样使用它们吗?

更多关于Golang在HTML模板中处理发送者名称地址邮件的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢,它起作用了!!

我尝试了多种方法:

“From test@gmail.com

From <“test@gmail.com”>

通常,收件人的电子邮件地址和姓名会这样书写:

"John Doe" <john.doe@example.com>

在HTML模板中处理发件人名称和地址时,需要正确转义尖括号并确保格式符合RFC 5322标准。以下是解决方案:

1. 模板中的正确写法

在HTML模板文件中,使用以下格式:

{{define "email"}}
发件人:{{.SenderName}} &lt;{{.SenderEmail}}&gt;
<!-- 其他内容 -->
{{end}}

2. Go代码中的处理

package main

import (
    "bytes"
    "fmt"
    "html/template"
    "net/mail"
)

type EmailData struct {
    SenderName  string
    SenderEmail string
    FullSender  string // 或者直接使用组合格式
}

func main() {
    // 使用ParseFiles解析模板
    tmpl, err := template.ParseFiles("email_template.html")
    if err != nil {
        panic(err)
    }

    data := EmailData{
        SenderName:  "测试发件人",
        SenderEmail: "test@mail.com",
    }

    var buf bytes.Buffer
    err = tmpl.Execute(&buf, data)
    if err != nil {
        panic(err)
    }

    fmt.Println(buf.String())
}

3. 使用mail.Address结构体

package main

import (
    "bytes"
    "fmt"
    "html/template"
    "net/mail"
)

func main() {
    tmplStr := `发件人:{{.Sender}}`
    
    tmpl, err := template.New("email").Parse(tmplStr)
    if err != nil {
        panic(err)
    }

    // 创建mail.Address
    sender := &mail.Address{
        Name:    "测试发件人",
        Address: "test@mail.com",
    }

    data := struct {
        Sender string
    }{
        Sender: sender.String(), // 这会生成 "测试发件人 <test@mail.com>"
    }

    var buf bytes.Buffer
    err = tmpl.Execute(&buf, data)
    if err != nil {
        panic(err)
    }

    fmt.Println("输出:", buf.String())
    // 输出: 发件人:测试发件人 <test@mail.com>
}

4. 如果必须使用固定格式字符串

package main

import (
    "bytes"
    "fmt"
    "html/template"
    "strings"
)

func main() {
    // 模板文件内容
    tmplStr := `发件人:{{.FormattedSender}}`
    
    tmpl, err := template.New("email").Parse(tmplStr)
    if err != nil {
        panic(err)
    }

    // 在Go代码中构建格式
    senderName := "测试发件人"
    senderEmail := "test@mail.com"
    formattedSender := fmt.Sprintf("%s &lt;%s&gt;", senderName, senderEmail)

    data := struct {
        FormattedSender template.HTML
    }{
        FormattedSender: template.HTML(formattedSender),
    }

    var buf bytes.Buffer
    err = tmpl.Execute(&buf, data)
    if err != nil {
        panic(err)
    }

    fmt.Println("渲染结果:", buf.String())
}

5. 使用自定义函数处理

package main

import (
    "bytes"
    "fmt"
    "html/template"
)

func formatSender(name, email string) template.HTML {
    return template.HTML(fmt.Sprintf("%s &lt;%s&gt;", name, email))
}

func main() {
    funcMap := template.FuncMap{
        "formatSender": formatSender,
    }

    tmplStr := `发件人:{{formatSender .Name .Email}}`
    
    tmpl, err := template.New("email").Funcs(funcMap).Parse(tmplStr)
    if err != nil {
        panic(err)
    }

    data := struct {
        Name  string
        Email string
    }{
        Name:  "测试发件人",
        Email: "test@mail.com",
    }

    var buf bytes.Buffer
    err = tmpl.Execute(&buf, data)
    if err != nil {
        panic(err)
    }

    fmt.Println("输出:", buf.String())
}

关键点:

  1. 在HTML模板中使用&lt;&gt;代替<>
  2. 使用mail.Address结构体可以确保正确的RFC格式
  3. 如果需要HTML安全输出,使用template.HTML类型
  4. 避免在模板中直接使用未转义的尖括号
回到顶部