在 Go 语言中发送邮件可以通过标准库 net/smtp
或第三方库(如 gomail
)实现。以下是两种方式的详细示例:
方法1:使用标准库 net/smtp
package main
import (
"fmt"
"net/smtp"
)
func sendEmailSMTP() error {
// 配置SMTP服务器信息
smtpHost := "smtp.example.com" // SMTP服务器地址
smtpPort := "587" // 端口(TLS常用587,SSL用465)
from := "your-email@example.com"
password := "your-password" // 密码或应用专用密码
to := []string{"recipient@example.com"}
// 邮件内容(注意格式必须符合RFC规范)
subject := "Subject: Test Email\n"
mime := "MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\n\n"
body := "<html><body><h1>Hello from Go!</h1></body></html>"
message := []byte(subject + mime + body)
// 认证并发送
auth := smtp.PlainAuth("", from, password, smtpHost)
err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message)
return err
}
func main() {
if err := sendEmailSMTP(); err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Email sent successfully")
}
}
注意事项:
安全连接:
- 如果使用SSL,需将端口改为
465
,并确保服务器支持。 - TLS加密会自动协商(Go的
smtp.SendMail
默认尝试STARTTLS)。
- 如果使用SSL,需将端口改为
权限问题:
- Gmail等邮箱可能需要开启“允许不够安全的应用”或使用应用专用密码。
方法2:使用第三方库 gomail
(推荐)
# 先安装gomail
go get gopkg.in/gomail.v2
package main
import (
"fmt"
gomail "gopkg.in/gomail.v2"
)
func sendEmailGomail() error {
m := gomail.NewMessage()
// 设置发件人、收件人、主题、正文(支持HTML)
m.SetHeader("From", "your-email@example.com")
m.SetHeader("To", "recipient@example.com")
m.SetHeader("Subject", "Test Email")
m.SetBody("text/html", "<h1>Hello from Gomail!</h1>")
// 添加附件(可选)
// m.Attach("/path/to/file.pdf")
dialer := gomail.NewDialer(
"smtp.example.com",
587,
"your-email@example.com",
"your-password",
)
return dialer.DialAndSend(m)
}
func main() {
if err := sendEmailGomail(); err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Email sent successfully")
}
}
优势:
- 更简洁的API:直接支持HTML、附件、抄送等功能。
- 自动重试:内置连接池和错误处理。
常见问题解决
认证失败:
- 检查邮箱服务商是否要求启用SMTP(如Gmail需在设置中开启)。
- 尝试使用应用专用密码代替账户密码。
连接超时:
dialer.Timeout = 30 * time.Second // gomail可设置超时时间
调试模式:
dialer.TLSConfig = &tls.Config{InsecureSkipVerify: true} // 仅测试环境使用!
企业邮箱配置:
- Exchange服务器可能需要NTLM认证,可使用github.com/Azure/go-ntlmssp。
如果需要更复杂的场景(如批量发送、模板引擎),可以结合以下工具: