Go语言使用gomail包发送邮件
目录
一、快速入门
go get gopkg.in/gomail.v2
package main
import (
"gopkg.in/gomail.v2"
)
func main() {
m := gomail.NewMessage()
// 发件人/收件人/主题
m.SetHeader("From", "admin@yourdomain.com")
m.SetHeader("To", "user@example.com")
m.SetHeader("Subject", "Go邮件测试")
// 正文内容(支持HTML)
m.SetBody("text/html", `你好,我是五岁小孩,我正在测试使用gomail发送邮件`)
// 连接SMTP服务器
d := gomail.NewDialer("smtp.exmail.qq.com", 465, "user", "password")
// 发送邮件
if err := d.DialAndSend(m); err != nil {
panic(err)
}
}
二、发送 html 邮件
package main
import (
"gopkg.in/gomail.v2"
)
func main() {
m := gomail.NewMessage()
// 发件人/收件人/主题
m.SetHeader("From", "admin@yourdomain.com")
m.SetHeader("To", "user@example.com")
m.SetHeader("Subject", "Go邮件测试")
// 正文内容(支持HTML)
m.SetBody("text/html", `<h1>你好,我是五岁小孩</h1>
<p>我正在测试使用gomail发送邮件</p>`)
// 连接SMTP服务器
d := gomail.NewDialer("smtp.exmail.qq.com", 465, "user", "password")
// 发送邮件
if err := d.DialAndSend(m); err != nil {
panic(err)
}
}
三、发送附件邮件
func sendTicket(email string) error {
m := gomail.NewMessage()
// 设置发件人别名
m.SetAddressHeader("From", "support@company.com", "技术支持中心")
// 添加附件(支持多个)
m.Attach("/var/logs/ticket_12345.log",
gomail.Rename("问题日志.log"),
gomail.SetHeader(map[string][]string{
"Content-ID": {"<logfile>"},
}),
)
// 嵌入图片到HTML
m.Embed("logo.png", gomail.Rename("company_logo"))
m.SetBody("text/html", `<img src="">
您的问题已受理,日志见附件`)
return dialer.DialAndSend(m)
}
四、完整代码
import (
"errors"
"fmt"
"gopkg.in/gomail.v2"
)
//定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码
type MailConfig struct {
Host string `json:"Host"` //邮箱服务器地址
Port int `json:"Port"` //邮箱服务器端口
User string `json:"User"` //邮箱账号
Pass string `json:"Pass"` //邮箱密码 如果是阿里邮箱 Pass填密码,qq邮箱填授权码
SSL bool `json:"SSL"` //SSL加密传输,端口==465是默认为true
}
//mailConfig 邮件配置MailConfig 不能为空
//mailFrom 邮件发送方 默认MailConfig账号
//mailTo 接收邮箱 不能为空
//subject 主题
//message 发送消息
func SendMail(mailConfig *MailConfig, mailFrom string, mailTo []string, subject string, message string) error {
//默认邮件来自配置邮箱
if IsEmpty(mailFrom) {
mailFrom = mailConfig.User
}
//接收消息的邮箱不能为空
if len(mailTo) <= 0 {
return errors.New("mailTo:接收消息的邮箱不能为空")
}
m := gomail.NewMessage()
m.SetHeader("From", m.FormatAddress(mailConfig.User, mailFrom)) //这种方式可以添加别名,
m.SetHeader("To", mailTo...) //发送给多个用户
m.SetHeader("Subject", subject) //设置邮件主题
m.SetBody("text/html", message) //设置邮件正文
//SSL加密
if mailConfig.SSL {
mailConfig.Port = 465
}
//连接
dialer := gomail.NewDialer(mailConfig.Host, mailConfig.Port, mailConfig.User, mailConfig.Pass)
//发送
erBySend := dialer.DialAndSend(m)
if erBySend != nil {
fmt.Printf("base package SendMail send error:%v", erBySend.Error())
//error
return erBySend
}
//success
return nil
}
常见问题
1. 邮箱服务的密码应该填写什么?
邮箱密码 如果是阿里邮箱 Pass填密码,qq邮箱填授权码
以 qq 邮箱为例,打开qq邮箱的设置,可以看到邮箱服务 SMTP 配置,包含服务器地址、端口、加密方式、密码
2. 发送报错?
以实际报错为准,大部分的错误都是 smtp 配置写错,还有就是发送太频繁,不同的邮箱都会有邮件数量限制
3. 发送邮件有限制吗?
具体以不同邮箱的说明为准,比如 qq 邮箱就有限制一分钟多少次,一天多少次
次,一天多少次