Go语言通过SMTP发送电子邮件的完整实现
介绍如何利用 Go 标准库中的 net/smtp 和 encoding/base64 包,通过 SMTP 协议发送格式规范的 HTML 邮件。涵盖认证配置、标题编码及消息体构造的关键步骤。
准备条件与环境依赖
Go 语言的标准库已经内置了 net/smtp 模块,无需安装第三方依赖即可实现基础的 SMTP 功能。在开始编写代码前,需确认以下信息:
- SMTP 服务器地址:如
smtp.mail.com。 - 端口号:通常为
25(非加密)或465/587(SSL/TLS),本示例使用默认 25 端口进行演示。 - 发件人账号与密码:用于登录认证的有效邮箱凭证。
- 目标收件人列表:至少包含一个有效的接收邮箱地址。
第1步:引入必要的标准库
为了实现邮件发送,我们需要导入格式化输出、邮件地址解析、SMTP 客户端以及 Base64 编码功能的包。在 main 函数开始前,添加以下 import 块:
package main
import (
"fmt"
"net/mail"
"net/smtp"
"encoding/base64"
)
第2步:配置连接参数与认证信息
首先定义 SMTP 主机、发件人邮箱及授权密码。使用 mail.Address 结构体来规范化显示名称和邮箱地址,这有助于生成符合 RFC 标准的 From 和 To 头部字段。
b64 := base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
host := "smtp.mail.com"
email := "mail1@mail.com"
password := "password"
toEmail := "mail2@mail.com"
from := mail.Address{"发送人", email}
to := mail.Address{"接收人", toEmail}
第3步:构建邮件头部 (Headers)
SMTP 协议要求邮件头部必须包含特定的字段,包括发件人、收件人、主题、MIME 版本及字符集编码。对于包含中文等非 ASCII 字符的标题,建议采用 ?UTF-8?B? 格式的 Base64 编码以确保兼容性。
header := make(map[string]string)
header["From"] = from.String()
header["To"] = to.String()
header["Subject"] = fmt.Sprintf("=?UTF-8?B?%s?=", b64.EncodeToString([]byte("邮件标题2")))
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/html; charset=UTF-8"
header["Content-Transfer-Encoding"] = "base64"
第4步:组装邮件消息体
邮件内容分为头部和正文两部分,中间以空行 (\r\n) 分隔。先将所有 Header 字段按顺序拼接,追加换行符后,再将经过 Base64 编码的邮件正文附加其后。注意:若未使用 Base64 编码正文,需将 Content-Transfer-Encoding 设为 8bit 或直接删除该头部。
body := "我是一封电子邮件!golang发出."
message := ""
for k, v := range header {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + b64.EncodeToString([]byte(body))
第5步:执行发送并处理错误
使用 smtp.SendMail 函数发起连接。首先需要创建认证对象,这里演示最基础的明文认证方式 smtp.PlainAuth。调用发送接口时,确保地址字符串格式正确,并对返回的 error 进行处理。
auth := smtp.PlainAuth(
"",
email,
password,
host,
)
err := smtp.SendMail(
host+":25",
auth,
email,
[]string{to.Email},
[]byte(message),
)
if err != nil {
panic(err)
}
完成判断与注意事项
当 smtp.SendMail 返回 nil 时,表示邮件已成功提交至 SMTP 服务器。以下是实际应用中需要注意的关键点:
- 安全性升级:生产环境中,25 端口往往不被允许或未加密。推荐使用
smtp.StartTLS或tls.Dial连接 465/587 端口,以保证传输安全。 - 附件支持:上述代码仅发送纯文本或简单 HTML。如需发送文件附件,需使用 multipart/mixed MIME 类型构建复杂的 Body 结构,或使用第三方库如
go-mail简化操作。 - 频率限制:部分 SMTP 服务商对短时间内的并发请求有限制,建议在后台任务中加入适当的延迟队列机制。
以上就是 Go 语言利用 net/smtp 包实现电子邮件发送的详细内容,更多关于 Golang 网络编程与邮件服务的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













