全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在 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]>

✅ 正确实现步骤如下:

  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),禁用明文传输。

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


# word  # go  # cad  # 编码  # app  # ai  # 路由  # cdn  # 邮箱  # 标准库  # String  # 封装  # mail  # CGI  # class  # protected  # href  # ASCII  # 邮箱地址  # 推荐使用  # 这类  # 不支持  # 不规范  # 发送邮件  # 仅靠  # 格式为  # 身份验证  # 换行符 


相关文章: 小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何通过二级域名建站提升品牌影响力?  高端建站如何打造兼具美学与转化的品牌官网?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何破解联通资金短缺导致的基站建设难题?  如何在建站主机中优化服务器配置?  建站之星导航菜单设置与功能模块配置全攻略  网站制作难吗安全吗,做一个网站需要多久时间?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何使用Golang table-driven基准测试_多组数据测量函数效率  香港服务器WordPress建站指南:SEO优化与高效部署策略  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何解决ASP生成WAP建站中文乱码问题?  Python路径拼接规范_跨平台处理说明【指导】  香港服务器租用费用高吗?如何避免常见误区?  如何在IIS7中新建站点?详细步骤解析  图册素材网站设计制作软件,图册的导出方式有几种?  Swift中循环语句中的转移语句 break 和 continue  jQuery 常见小例汇总  如何快速辨别茅台真假?关键步骤解析  为什么Go需要go mod文件_Go go mod文件作用说明  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何快速生成橙子建站落地页链接?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  宝塔新建站点为何无法访问?如何排查?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  php json中文编码为null的解决办法  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  广州商城建站系统开发成本与周期如何控制?  建站主机类型有哪些?如何正确选型  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  建站主机数据库如何配置才能提升网站性能?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在IIS中新建站点并配置端口与物理路径?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  广德云建站网站建设方案与建站流程优化指南  如何在建站宝盒中设置产品搜索功能?  ,柠檬视频怎样兑换vip?  如何通过免费商城建站系统源码自定义网站主题与功能?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何用PHP快速搭建CMS系统?  北京制作网站的公司,北京铁路集团官方网站?  如何在阿里云虚拟服务器快速搭建网站?  建站主机服务器选型指南与性能优化方案解析  制作宣传网站的软件,小红书可以宣传网站吗?  中山网站推广排名,中山信息港登录入口? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。