1、使用gopkg.in/gomail.v2发送邮件
1.1 先安装gomail包
go get -v gopkg.in/gomail.v2
实现代码如下:
package main
import (
"crypto/tls"
"fmt"
"gopkg.in/gomail.v2"
)
func main() {
test1()
}
func test1() {
message := `
<p> Hello %s,</p>
<p style="text-indent:2em">test test test test test test test test test test test test.</p>
<p style="text-indent:2em">test test test test test test test test test test test test.</p>
<p style="text-indent:2em">test test test test test test test test test test test test.</P>
<p style="text-indent:2em">Best Wishes!</p>
`
// QQ 邮箱:
// SMTP 服务器地址:smtp.qq.com(SSL协议端口:465/994 | 非SSL协议端口:25)
// 163 邮箱:
// SMTP 服务器地址:smtp.163.com(端口:25)
host := "smtp.qq.com"
port := 25
userName := "******@qq.com"
password := "**********"
m := gomail.NewMessage()
m.SetHeader("From", userName) // 发件人
// m.SetHeader("From", "alias"+"<"+userName+">") // 增加发件人别名
m.SetHeader("To", "******@qq.com", "******@qq.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个
m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个
m.SetHeader("Subject", "Hello!") // 邮件主题
// text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
// 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等
m.SetBody("text/html", fmt.Sprintf(message, "testUser"))
// text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理
// m.SetBody("text/plain", "纯文本")
// m.Attach("test.sh") // 附件文件,可以是文件,照片,视频等等
// m.Attach("lolcatVideo.mp4") // 视频
// m.Attach("lolcat.jpg") // 照片
d := gomail.NewDialer(
host,
port,
userName,
password,
)
// 关闭SSL协议认证
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
if err := d.DialAndSend(m); err != nil {
panic(err)
}
}
1.2、创建一个Message
实例,Message
提供了整个邮件协议内容的构建,默认实例采用UTF-8
字符集和Quoted-printable
编码。
m := gomail.NewMessage()
1.3、设置发件人
m.SetHeader("From", userName) // 发件人
// m.SetHeader("From", "test"+"<"+userName+">") // 增加发件人别名
如果你觉得发件人只是一个邮箱名称,让你不好识别发件人是谁,这时可以通过注释行来设置发件人的别名,"test"即是发件人的别名名称。
1.4、设置收件人、抄送、暗送
// 收件人,可以多个收件人
mailTo := []string{
"******@qq.com",
"******@qq.com",
}
m.SetHeader("To", mailTo...)
// m.SetHeader("To", "******@qq.com", "******@qq.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个
m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个
可以通过数组设置多个收件人、抄送和暗送,或者和注释行一样使用逗号分开
1.5、设置邮件内容
// text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
// 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等
m.SetBody("text/html", fmt.Sprintf(message, "testUser"))
// text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理
// m.SetBody("text/plain", "纯文本")
"text/plain"文本格式:text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理;
"text/html"文本格式:text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。可以通过 text/html 对文本格式进行特殊处理,如换行、缩进、加粗等等
1.6、设置附件
m.Attach("test.sh") // 附件文件,可以是文件,照片,视频等等
// m.Attach("lolcatVideo.mp4") // 视频
// m.Attach("lolcat.jpg") // 照片
附件可以为文件、视频、照片等等
1.6.1、通过gomail.Rename()方法设置附件的别名
m.Attach(url, gomail.Rename(path.Base(file_name)))
1.6.2、在起别名的时候,如果别名中存在中文时可能会出现乱码:
m.Attach(url, gomail.Rename(mime.QEncoding.Encode("UTF-8", path.Base(file_name))))
通过mime.QEncoding.Encode()设置格式为UTF-8,防止乱码。
1.6.3、将邮件内容格式更改为Base64
编码
m := gomail.NewMessage(
gomail.SetEncoding(gomail.Base64),
)
1.7、创建SMTP客户端,连接到远程的邮件服务器
host := "smtp.qq.com"
port := 25
userName := "******@qq.com"
password := "**********" // qq邮箱填授权码
d := gomail.NewDialer(
host,
port,
userName,
password,
)
1.7.1、QQ授权码获取方式:
出于邮箱安全的考虑,很多邮箱缺省是关闭 POP3/SMTP 服务的,需要登录邮箱设置后开启。
以 QQ 邮箱为例,进入邮箱“设置”,在“帐户”项里就可找到“POP3/SMTP服务”的设置项,进行开启。
温馨提示:登录第三方客户端时,密码框请输入“授权码”进行验证。
也就是说,在使用 QQ 邮箱发送邮件的时候,需要使用授权码,而不是 QQ 密码!
1.7.2、常用邮箱信息
邮箱类型 | SMTP 服务器地址 | SSL协议端口 | 非SSL协议端口 |
QQ 邮箱 | smtp.qq.com | 465/587 | 25 |
163 邮箱 | smtp.163.com | 465/994 | 25 |
office365 邮箱 | smtp.office365.com | 465/587 | 25 |
1.8、关闭TLS认证:
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
设置为true时,关闭TLS认证,否则默认开启,需要配置证书认证,稍微麻烦一些。
1.9、测试效果如下:
2、使用 github.com/jordan-wright/email 和 "net/smtp" 发送邮件,用QQ邮件为发件人为例:
func emailTest() {
host := "smtp.qq.com"
port := "25"
userName := "*****@qq.com"
password := "******" // qq邮箱填授权码
e := &email.Email{
To: []string{"******@qq.com", "******1@qq.com"},
From: userName,
Subject: "Email Send Test",
Text: []byte("Text Body is, of course, supported!"),
HTML: []byte("<h1>This a test email</h1>"),
Headers: textproto.MIMEHeader{},
}
err := e.Send(host+port, smtp.PlainAuth("", userName, password, host))
if err != nil {
panic(err)
}
}
2.1、测试效果如下: