全网整合营销服务商

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

免费咨询热线: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及设计样式?  建站之星如何快速生成多端适配网站?  中山网站制作网页,中山新生登记系统登记流程?  如何做网站制作流程,*游戏网站怎么搭建?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  jQuery 常见小例汇总  广东企业建站网站优化与SEO营销核心策略指南  建站之星后台管理如何实现高效配置?  如何通过云梦建站系统实现SEO快速优化?  如何在云主机快速搭建网站站点?  北京的网站制作公司有哪些,哪个视频网站最好?  如何配置FTP站点权限与安全设置?  建站上传速度慢?如何优化加速网站加载效率?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  怀化网站制作公司,怀化新生儿上户网上办理流程?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何快速搭建支持数据库操作的智能建站平台?  清除minerd进程的简单方法  ,网页ppt怎么弄成自己的ppt?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  制作网站的软件免费下载,免费制作app哪个平台好?  如何通过老薛主机一键快速建站?  活动邀请函制作网站有哪些,活动邀请函文案?  香港服务器如何优化才能显著提升网站加载速度?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  临沂网站制作公司有哪些,临沂第四中学官网?  香港服务器租用每月最低只需15元?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何高效搭建专业期货交易平台网站?  制作电商网页,电商供应链怎么做?  如何在阿里云完成域名注册与建站?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  哈尔滨网站建设策划,哈尔滨电工证查询网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何通过山东自助建站平台快速注册域名?  金*站制作公司有哪些,金华教育集团官网?  完全自定义免费建站平台:主题模板在线生成一站式服务  山东云建站价格为何差异显著?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站主机默认首页配置指南:核心功能与访问路径优化  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何通过可视化优化提升建站效果?  北京企业网站设计制作公司,北京铁路集团官方网站?  网站专业制作公司有哪些,做一个公司网站要多少钱?  建站主机空间推荐 高性价比配置与快速部署方案解析  建站之星如何实现网站加密操作?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何确认建站备案号应放置的具体位置? 

您的项目需求

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