Golang发送邮件需配置SMTP信息并使用net/smtp包。首先导入net/smtp、net/mail等包,设置SMTP服务器地址、端口、用户名密码,构建发件人、收件人、主题、正文等邮件头信息,通过map拼接邮件内容,调用smtp.SendMail发送。对于TLS加密的服务器(如Gmail),需用crypto/tls包建立安全连接,使用tls.Dial和smtp.NewClient手动管理连接、认证、发送流程,并注意生产环境应验证证书。发送HTML邮件时,将Content-Type设为text/html,正文为HTML字符串,建议内联CSS样式并提供纯文本备选。添加附件需使用mime/multipart包创建multipart/mixed类型邮件,将正文和附件作为不同part加入,附件需Base64编码并设置Content-Disposition为attachment。错误处理方面,需检查smtp.SendMail返回的error,区分网络、认证、服务器拒绝等异常,可加入重试机制应对临时故障。为避免邮件被标记为垃圾邮件,应使用可信发件人域名,配置SPF、DKIM DNS记录,避免敏感词,提供退订链接,控制发送频率。

Golang发送邮件的核心在于
net/smtp
smtp.SendMail
解决方案:
要使用Golang发送电子邮件,你需要以下几个步骤:
net/smtp
net/mail
errors
log
smtp.SendMail
下面是一个基本的示例:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"net/smtp"
"net/mail"
"log"
"errors"
)
func sendEmail(from, password, to, subject, body string) error {
// 配置SMTP服务器信息
smtpServer := "smtp.example.com" // 你的SMTP服务器地址
smtpPort := 587 // SMTP端口,通常是587或465
// 构建邮件消息
fromAddress := mail.Address{Name: "Sender Name", Address: from}
toAddress := mail.Address{Name: "Recipient Name", Address: to}
header := make(map[string]string)
header["From"] = fromAddress.String()
header["To"] = toAddress.String()
header["Subject"] = subject
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/plain; charset=\"utf-8\""
message := ""
for k, v := range header {
message += k + ": " + v + "\r\n"
}
message += "\r\n" + body
// 认证信息
auth := smtp.PlainAuth("", from, password, smtpServer)
// 连接到服务器并发送电子邮件
err := smtp.SendMail(smtpServer+":"+string(rune(smtpPort)), auth, from, []string{to}, []byte(message))
if err != nil {
return err
}
return nil
}
func main() {
// 替换成你自己的信息
from := "your_email@example.com"
password := "your_password"
to := "recipient_email@example.com"
subject := "Hello from Golang!"
body := "This is a test email sent from Golang."
err := sendEmail(from, password, to, subject, body)
if err != nil {
log.Fatal(err)
}
log.Println("Email sent successfully!")
}这段代码的关键点在于
smtp.SendMail
smtp.SendMail
tls.Dial
smtp.NewClient
package main
import (
"crypto/tls"
"fmt"
"log"
"net"
"net/smtp"
"net/mail"
)
func sendEmailTLS(from, password, to, subject, body string) error {
// 配置SMTP服务器信息
smtpServer := "smtp.gmail.com" // Gmail SMTP服务器地址
smtpPort := 587 // Gmail SMTP端口
// 构建邮件消息
fromAddress := mail.Address{Name: "Sender Name", Address: from}
toAddress := mail.Address{Name: "Recipient Name", Address: to}
header := make(map[string]string)
header["From"] = fromAddress.String()
header["To"] = toAddress.String()
header["Subject"] = subject
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/plain; charset=\"utf-8\""
message := ""
for k, v := range header {
message += k + ": " + v + "\r\n"
}
message += "\r\n" + body
// 认证信息
auth := smtp.PlainAuth("", from, password, smtpServer)
// TLS配置
tlsConfig := &tls.Config{
InsecureSkipVerify: true, // 注意:在生产环境中,应该验证服务器证书
ServerName: smtpServer,
}
// 连接到服务器
conn, err := tls.Dial("tcp", smtpServer+":"+string(rune(smtpPort)), tlsConfig)
if err != nil {
return err
}
// 创建SMTP客户端
client, err := smtp.NewClient(conn, smtpServer)
if err != nil {
return err
}
defer client.Close()
// 认证
if err = client.Auth(auth); err != nil {
return err
}
// 设置发件人和收件人
if err = client.Mail(from); err != nil {
return err
}
if err = client.Rcpt(to); err != nil {
return err
}
// 发送邮件数据
w, err := client.Data()
if err != nil {
return err
}
_, err = w.Write([]byte(message))
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
// 退出
return client.Quit()
}
func main() {
// 替换成你自己的信息
from := "your_email@gmail.com" // Gmail邮箱
password := "your_gmail_password" // Gmail应用专用密码
to := "recipient_email@example.com"
subject := "Hello from Golang with TLS!"
body := "This is a test email sent from Golang using TLS."
err := sendEmailTLS(from, password, to, subject, body)
if err != nil {
log.Fatal(err)
}
log.Println("Email sent successfully with TLS!")
}注意:Gmail需要使用“应用专用密码”,而不是你的常规密码。并且
InsecureSkipVerify: true
发送HTML邮件需要在邮件头中设置
Content-Type
text/html
header["Content-Type"] = "text/html; charset=\"utf-8\"" body = "<html><body><h1>Hello, World!</h1><p>This is an HTML email.</p></body></html>"
需要注意的是,不同邮件客户端对HTML的支持程度不同,所以最好提供一个纯文本的替代版本,以保证邮件的可读性。 我曾经遇到过一个问题,就是HTML邮件在某些客户端显示不正确,后来发现是CSS样式没有内联导致的。
添加附件需要使用
mime/multipart
package main
import (
"bytes"
"encoding/base64"
"fmt"
"io"
"log"
"mime/multipart"
"net/mail"
"net/smtp"
"os"
"path/filepath"
)
func sendEmailWithAttachment(from, password, to, subject, body, attachmentPath string) error {
// 配置SMTP服务器信息
smtpServer := "smtp.example.com" // 你的SMTP服务器地址
smtpPort := 587 // SMTP端口,通常是587或465
// 构建邮件消息
fromAddress := mail.Address{Name: "Sender Name", Address: from}
toAddress := mail.Address{Name: "Recipient Name", Address: to}
// 创建一个buffer来存储邮件内容
var bodyBuf bytes.Buffer
writer := multipart.NewWriter(&bodyBuf)
// 添加邮件头
header := make(map[string]string)
header["From"] = fromAddress.String()
header["To"] = toAddress.String()
header["Subject"] = subject
header["MIME-Version"] = "1.0"
header["Content-Type"] = "multipart/mixed; boundary=\"" + writer.Boundary() + "\""
// 添加邮件正文
part, err := writer.CreatePart(map[string][]string{
"Content-Type": {"text/plain; charset=utf-8"},
})
if err != nil {
return err
}
_, err = part.Write([]byte(body))
if err != nil {
return err
}
// 添加附件
file, err := os.Open(attachmentPath)
if err != nil {
return err
}
defer file.Close()
// 获取文件名
filename := filepath.Base(attachmentPath)
// 创建附件的part
part, err = writer.CreatePart(map[string][]string{
"Content-Type": {"application/octet-stream"},
"Content-Disposition": {fmt.Sprintf("attachment; filename=\"%s\"", filename)},
"Content-Transfer-Encoding": {"base64"},
})
if err != nil {
return err
}
// 将文件内容编码为base64并写入part
encoder := base64.NewEncoder(base64.StdEncoding, part)
_, err = io.Copy(encoder, file)
if err != nil {
return err
}
encoder.Close()
// 关闭multipart writer
err = writer.Close()
if err != nil {
return err
}
// 认证信息
auth := smtp.PlainAuth("", from, password, smtpServer)
// 连接到服务器并发送电子邮件
err = smtp.SendMail(smtpServer+":"+string(rune(smtpPort)), auth, from, []string{to}, bodyBuf.Bytes())
if err != nil {
return err
}
return nil
}
func main() {
// 替换成你自己的信息
from := "your_email@example.com"
password := "your_password"
to := "recipient_email@example.com"
subject := "Email with Attachment from Golang!"
body := "This is a test email with an attachment sent from Golang."
attachmentPath := "path/to/your/attachment.txt" // 替换成你的附件路径
err := sendEmailWithAttachment(from, password, to, subject, body, attachmentPath)
if err != nil {
log.Fatal(err)
}
log.Println("Email with attachment sent successfully!")
}这个例子展示了如何添加一个附件。你可以根据需要添加多个附件。 我曾经在处理一个大附件时遇到内存溢出的问题,后来通过分块读取文件并编码为base64解决了。
smtp.SendMail
error
针对不同的错误,你可以采取不同的措施,例如重试、记录日志或通知用户。 我建议在代码中加入重试机制,以应对临时的网络问题。
避免邮件被标记为垃圾邮件是一个复杂的问题,涉及到多个方面:
这些只是一些建议,具体的措施需要根据你的具体情况进行调整。 我曾经因为忘记设置SPF记录,导致邮件经常被标记为垃圾邮件。
总而言之,Golang的
net/smtp
以上就是Golang发送电子邮件实现 smtp包配置与发送的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号