在业务开发中,邮件发送是非常常见的功能需求,比如用户注册验证码、订单通知、系统告警等场景都需要用到邮件服务。Golang标准库中已经内置了net/smtp包,我们可以直接基于这个包实现SMTP协议的邮件发送功能,不需要引入额外的第三方依赖,开发效率更高。

环境准备与依赖说明
本次演示不需要额外安装第三方库,只需要使用Golang自带的net/smtp包即可。不过需要先确认你的邮箱服务商开启了SMTP服务,并且获取对应的SMTP服务器地址、端口以及授权码,不同邮箱服务商的配置信息不同,以下是常见邮箱的SMTP配置参考:
| 邮箱类型 | SMTP服务器地址 | 端口 |
|---|---|---|
| QQ邮箱 | smtp.qq.com | 465(SSL)或587(TLS) |
| 163邮箱 | smtp.163.com | 465(SSL)或25 |
| Gmail | smtp.gmail.com | 587(TLS) |
核心代码实现
基础邮件发送示例
首先我们实现一个最基础的纯文本邮件发送功能,代码如下:
package main
import (
"fmt"
"net/smtp"
)
// 邮箱配置结构体
type EmailConfig struct {
SMTPHost string // SMTP服务器地址
SMTPPort string // SMTP端口
SenderEmail string // 发件人邮箱
SenderPassword string // 发件人授权码
}
// 发送纯文本邮件
func SendTextEmail(config EmailConfig, toEmail string, subject string, body string) error {
// 拼接SMTP服务器地址
smtpAddr := config.SMTPHost + ":" + config.SMTPPort
// 邮件内容格式
msg := []byte("To: " + toEmail + "rn" +
"From: " + config.SenderEmail + "rn" +
"Subject: " + subject + "rn" +
"rn" +
body + "rn")
// 身份认证
auth := smtp.PlainAuth("", config.SenderEmail, config.SenderPassword, config.SMTPHost)
// 发送邮件
err := smtp.SendMail(smtpAddr, auth, config.SenderEmail, []string{toEmail}, msg)
if err != nil {
return err
}
return nil
}
func main() {
// 配置邮箱信息,这里以ipipp.com邮箱为例
config := EmailConfig{
SMTPHost: "smtp.ipipp.com",
SMTPPort: "465",
SenderEmail: "test@ipipp.com",
SenderPassword: "your_smtp_auth_code", // 替换为你的邮箱SMTP授权码
}
// 发送邮件
err := SendTextEmail(config, "receiver@ipipp.com", "测试邮件", "这是一封用Golang发送的测试邮件")
if err != nil {
fmt.Println("邮件发送失败:", err)
return
}
fmt.Println("邮件发送成功")
}
发送HTML格式邮件
如果需要发送带格式的邮件,比如包含链接、样式的内容,可以发送HTML格式的邮件,只需要修改邮件头的Content-Type即可:
package main
import (
"fmt"
"net/smtp"
)
type EmailConfig struct {
SMTPHost string
SMTPPort string
SenderEmail string
SenderPassword string
}
// 发送HTML邮件
func SendHTMLEmail(config EmailConfig, toEmail string, subject string, htmlBody string) error {
smtpAddr := config.SMTPHost + ":" + config.SMTPPort
// 设置邮件头为HTML格式
msg := []byte("To: " + toEmail + "rn" +
"From: " + config.SenderEmail + "rn" +
"Subject: " + subject + "rn" +
"Content-Type: text/html; charset=UTF-8rn" +
"rn" +
htmlBody + "rn")
auth := smtp.PlainAuth("", config.SenderEmail, config.SenderPassword, config.SMTPHost)
err := smtp.SendMail(smtpAddr, auth, config.SenderEmail, []string{toEmail}, msg)
if err != nil {
return err
}
return nil
}
func main() {
config := EmailConfig{
SMTPHost: "smtp.ipipp.com",
SMTPPort: "465",
SenderEmail: "test@ipipp.com",
SenderPassword: "your_smtp_auth_code",
}
// HTML内容
htmlContent := "<h1>欢迎注册</h1><p>您的验证码是:<strong>123456</strong>,5分钟内有效</p>"
err := SendHTMLEmail(config, "receiver@ipipp.com", "注册验证码", htmlContent)
if err != nil {
fmt.Println("邮件发送失败:", err)
return
}
fmt.Println("HTML邮件发送成功")
}
常见问题与注意事项
- SMTP授权码不是邮箱登录密码,需要在邮箱设置中单独开启SMTP服务后获取,填写错误会导致认证失败。
- 如果使用的是465端口,需要开启SSL连接,Golang的
net/smtp包默认不支持SSL,需要额外使用crypto/tls包建立加密连接,或者使用第三方库如gopkg.in/gomail.v2简化操作。 - 部分邮箱服务商对单日发送邮件数量有限制,如果是批量发送邮件,建议控制发送频率,避免被判定为垃圾邮件。
- 收件人地址如果有多个,可以在
smtp.SendMail的收件人参数中传入多个地址组成的切片。
总结
通过Golang的net/smtp包我们可以快速实现邮箱发送服务,核心逻辑就是配置SMTP参数、构建邮件内容、完成身份认证后调用发送接口。如果需要更复杂的功能,比如添加附件、群发邮件等,可以基于现有代码扩展,或者选择合适的第三方邮件库提升开发效率。掌握这个能力后,你可以轻松在各类Golang项目中集成邮件通知功能。