0

0

如何在 Go 中通过 SMTP 发送邮件并自定义发件人姓名

聖光之護

聖光之護

发布时间:2025-12-29 19:53:22

|

554人浏览过

|

来源于php中文网

原创

如何在 Go 中通过 SMTP 发送邮件并自定义发件人姓名

go 中使用标准库 `net/smtp` 发送邮件时,仅靠 `client.mail()` 传入带名称的邮箱会导致 501 错误;正确做法是将“显示名称 + 邮箱”格式写入邮件正文头部的 `from` 字段,而 `client.mail()` 参数必须为纯邮箱地址。

Go 标准库 net/smtp 的 Client.Mail(from string) 方法仅接受 RFC 5321 兼容的纯邮箱地址(如 [email protected],不支持 "Name " 这类带显示名的格式——否则 SMTP 服务器会拒绝并返回 501 5.1.7 Invalid address。

真正控制收件端显示名称的,是邮件内容头部(MIME header)中的 From: 字段。该字段遵循 RFC 5322,允许使用带引号的显示名语法:

From: Sandy Sender <[email protected]>

✅ 正确实现步骤如下:

Figma
Figma

Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

下载
  1. Client.Mail() 传纯邮箱地址(用于 SMTP 协议层身份验证与投递路由);
  2. 在构造邮件正文时,在头部显式设置 From: 行,格式为 "显示名 ";
  3. 确保整个邮件符合 MIME 格式(含空行分隔头与体、正确编码等)。

✅ 手动构造示例(标准库)

package main

import (
    "fmt"
    "net/smtp"
    "strings"
)

func main() {
    auth := smtp.PlainAuth("", "user@example.com", "app-password", "smtp.example.com")

    to := []string{"[email protected]"}
    from := "[email protected]" // ← 仅邮箱!用于 Mail()
    fromHeader := "Sandy Sender <" + from + ">" // ← 带名格式!用于 From: 头部

    msg := fmt.Sprintf(
        "From: %s\r\n"+
            "To: %s\r\n"+
            "Subject: Hello from Go!\r\n"+
            "MIME-Version: 1.0\r\n"+
            "Content-Type: text/plain; charset=utf-8\r\n"+
            "\r\n"+
            "This is the body of the message.",
        fromHeader, strings.Join(to, ", "),
    )

    err := smtp.SendMail(
        "smtp.example.com:587",
        auth,
        from,     // ← 关键:纯邮箱
        to,
        []byte(msg),
    )
    if err != nil {
        panic(err)
    }
}

✅ 推荐方案:使用 gomail(更安全、更简洁)

手动拼接邮件头易出错(如编码缺失、换行符不规范)。推荐使用成熟封装库 gomail(v2),它自动处理 RFC 合规性、UTF-8 编码、MIME 分隔等细节:

package main

import (
    "gopkg.in/gomail.v2"
)

func main() {
    m := gomail.NewMessage()
    m.SetAddressHeader("From", "[email protected]", "Sandy Sender")
    m.SetAddressHeader("To", "[email protected]")
    m.SetHeader("Subject", "Hello!")
    m.SetBody("text/plain", "This is the body of the message.")

    d := gomail.NewPlainDialer("smtp.example.com", 587, "user@example.com", "app-password")

    if err := d.DialAndSend(m); err != nil {
        panic(err)
    }
}
⚠️ 注意事项: 显示名(如 "Sandy Sender")若含非 ASCII 字符(如中文),gomail 会自动进行 B 类型 MIME 编码(如 =?UTF-8?B?5byg5LiJ?=),而手动拼接需自行调用 mime.BEncoding.Encode(); SMTP 认证凭据建议使用应用专用密码(如 Gmail App Password),避免主密码泄露; 生产环境务必启用 TLS(gomail.NewDialer 支持 TLSConfig),禁用明文传输。

通过分离「协议层发件地址」与「展示层发件人信息」,即可优雅实现专业邮件署名效果。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

455

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

6

2025.12.06

常见的编码方式
常见的编码方式

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。想了解更多编码方式相关内容,可以阅读本专题下面的文章。

570

2023.10.24

a和A对应的ASCII码数值
a和A对应的ASCII码数值

a的ascii码是65,a的ascii码是97;ascii码表中,一个字母的大小写数值相差32,一般知道大写字母的ascii码数值,其对应的小写字母的ascii码数值就算出来了,是大写字母的ascii码数值“+32”。想了解更多相关的内容,可阅读本专题下面的相关文章。

2020

2024.10.24

Golang 命令行工具(CLI)开发实战
Golang 命令行工具(CLI)开发实战

本专题系统讲解 Golang 在命令行工具(CLI)开发中的实战应用,内容涵盖参数解析、子命令设计、配置文件读取、日志输出、错误处理、跨平台编译以及常用CLI库(如 Cobra、Viper)的使用方法。通过完整案例,帮助学习者掌握 使用 Go 构建专业级命令行工具与开发辅助程序的能力。

1

2025.12.29

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

162

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

52

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

108

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号