golang发送邮件时处理smtp身份验证需使用smtp.plainauth提供正确的用户名、密码(或授权码)及smtp服务器域名,确保host参数与服务器地址一致,避免因认证信息错误或域名不匹配导致失败。实际操作中应使用邮箱服务商提供的应用专用密码,并通过环境变量安全加载敏感信息,以提高安全性。

在Golang中发送电子邮件,核心是通过标准库的
net/smtp
要使用Golang的
net/smtp
package main
import (
"log"
"net/smtp"
"strings"
)
func main() {
// SMTP服务器信息
smtpHost := "smtp.example.com" // 替换为你的SMTP服务器地址,如 smtp.qq.com, smtp.gmail.com
smtpPort := "587" // 通常是587(TLS)或465(SSL)
// 发件人信息
from := "your_email@example.com" // 替换为你的发件邮箱
password := "your_email_password" // 替换为你的邮箱密码或授权码
// 收件人信息
to := []string{"recipient@example.com"} // 可以是多个收件人
// 邮件内容
subject := "Subject: Golang邮件发送测试\r\n"
body := "Hello, 这是Golang发送的第一封邮件!\r\n"
// 邮件的From, To, Subject等头信息需要手动添加到消息体前面
// 注意:这里的From和To是邮件头信息,与smtp.SendMail的from和to参数不同,但通常保持一致
msg := []byte("From: " + from + "\r\n" +
"To: " + strings.Join(to, ",") + "\r\n" +
subject +
"\r\n" + // 空行是邮件头和邮件体之间的分隔符
body)
// 认证信息
// smtp.PlainAuth(identity, username, password, host)
// identity 通常为空字符串,username是你的邮箱地址,password是邮箱密码或授权码,host是SMTP服务器地址
auth := smtp.PlainAuth("", from, password, smtpHost)
// 发送邮件
// smtp.SendMail(addr string, a Auth, from string, to []string, msg []byte) error
// addr: SMTP服务器地址和端口,如 "smtp.example.com:587"
// a: 认证信息
// from: 发件人邮箱
// to: 收件人邮箱列表
// msg: 邮件内容,包含头信息和正文
err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg)
if err != nil {
log.Printf("发送邮件失败: %v", err)
return
}
log.Println("邮件发送成功!")
}
在实际使用时,你需要将
smtpHost
smtpPort
from
password
to
password
立即学习“go语言免费学习笔记(深入)”;
在Golang中使用
net/smtp
smtp.PlainAuth
smtp.Auth
smtp.SendMail
Auth
PlainAuth
PlainAuth(identity, username, password, host string)
identity
""
username
your_email@example.com
password
host
smtp.qq.com
smtp.gmail.com
host
unencrypted connection
server name mismatch
除了
PlainAuth
net/smtp
CRAMMD5Auth
LoginAuth
PlainAuth
host
发送纯文本邮件相对直接,但如果想让邮件内容更丰富,比如包含HTML格式,或者需要发送附件,
net/smtp
发送HTML内容: 关键在于在邮件头中添加
Content-Type: text/html; charset="UTF-8"
// ... (之前的import和变量定义不变)
htmlBody := `
<html>
<head></head>
<body>
<h1>你好,这是一个HTML邮件!</h1>
<p style="color: blue;">这是用Golang发送的,是不是很酷?</p>
<img src="https://via.placeholder.com/150" alt="Placeholder Image">
</body>
</html>`
// 修改邮件内容和头部
msg := []byte("From: " + from + "\r\n" +
"To: " + strings.Join(to, ",") + "\r\n" +
subject +
"MIME-version: 1.0;\r\n" + // 声明MIME版本
"Content-Type: text/html; charset=\"UTF-8\";\r\n" + // 关键:指定内容类型为HTML
"\r\n" + // 空行分隔头部和正文
htmlBody)
// ... (smtp.SendMail 调用不变)发送附件: 这才是
net/smtp
multipart/mixed
Content-Type
Content-Disposition
boundary
例如,一个带附件的邮件结构大致如下:
Content-Type: multipart/mixed; boundary="BOUNDARY_STRING" --BOUNDARY_STRING Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 这是邮件正文。 --BOUNDARY_STRING Content-Type: application/octet-stream; name="filename.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="filename.pdf" [Base64编码的附件内容] --BOUNDARY_STRING--
由于
net/smtp
gomail
go-email-builder
net/smtp
net/smtp
在使用Golang的
net/smtp
认证失败 (Authentication failed):
535 Authentication failed
550 Authentication Required
smtp.PlainAuth
host
PlainAuth
host
smtp.SendMail
连接超时或拒绝 (Connection refused/timeout):
dial tcp: connect: connection refused
i/o timeout
smtp.gmail.com:587
465
ping
telnet smtp.example.com 587
邮件被拒绝或退回 (Mail rejected/bounced):
550 Message rejected
554 Transaction failed
TLS/SSL握手失败 (TLS handshake error):
tls: handshake failure
x509: certificate signed by unknown authority
tls.Config
通用排查建议:
以上就是怎样用Golang发送电子邮件 使用smtp包实现邮件发送功能的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号