SMTP协议介绍
SMTP协议全称是Simple Mail Tansfer Protocol,中文翻译就是简单的邮件传输协议。go标准库也实现了这个协议,在go的net/smtp包下可以看到它的具体实现,可以看到go是通过一系列的SMTP指令来实现的。SMTP协议发送邮件的指令流程大致如下:
快速发送一封邮件
我们可以直接使用net/smtp下封装好的函数SendMail来快速发送一封邮件,这里使用QQ邮箱来示例:
package main
import (
"log"
"net/smtp"
)
func main() {
// 设置发送方账户信息信息,这边密码要填入邮箱授权码,获取授权码步骤可以网上查一查
auth := smtp.PlainAuth("", "211019847@qq.com", "填入你的邮箱授权码", "smtp.qq.com")
// 设置接收方信息
to := []string{"573419235@qq.com"}
// 编辑邮件内容
msg := []byte("To: 573419235@qq.com\r\n" +
"Subject: discount Gophers!\r\n" +
"\r\n" +
"This is the email body.\r\n")
// 调用函数发送邮件
err := smtp.SendMail("smtp.qq.com:25", auth, "211019847@qq.com", to, msg)
if err != nil {
log.Fatal(err)
}
}
运行上面的方法后,就会收到一封主题为discount Gophers!,内容为**This is the email body.**的邮件了。
上面的msg需遵守RFC 822规范。
使用自定义步骤发送一封邮件
上面是直接调用了封装好的函数来发送邮件,同时net/smtp包也开放了SMTP的指令方法,我们可以根据SMTP的指令流程来自己构建一个发送邮件的方法,
具体代码如下:
package main
import (
"crypto/tls"
"log"
"net/smtp"
)
func main() {
// 设置发送方账号信息
auth := smtp.PlainAuth("", "211019847@qq.com", "填入你的邮箱授权码", "smtp.qq.com")
// 与QQ的`SMTP`服务器建立`TCP`连接
client,err:=smtp.Dial("smtp.qq.com:25")
if err!=nil {
log.Fatal(err)
}
// 发送HELO/EHLO指令
err=client.Hello("灰灰")
if err!=nil {
log.Fatal(err)
}
// 客户端开启`TLS`加密
config := &tls.Config{ServerName: "smtp.qq.com"}
client.StartTLS(config)
// 发送AUTH指令验证发送方账号信息
err=client.Auth(auth)
if err!=nil {
log.Fatal(err)
}
// 发送MAIL指令
err=client.Mail("211019847@qq.com")
if err!=nil {
log.Fatal(err)
}
// 发送RCPT指令
err=client.Rcpt("573419235@qq.com")
if err!=nil {
log.Fatal(err)
}
// 发送DATA指令
w,err:=client.Data()
if err!=nil {
log.Fatal(err)
}
// 写入消息
msg:=[]byte("FROM: 211019847@qq.com\n" +
"To: 573419235@qq.com\r\n" +
"Subject: Go MAIL\r\n" +
"\r\n" +
"GO MAIL TEST!.\r\n")
w.Write(msg)
w.Close()
// 关闭客户端
client.Quit()
}
运行上面的方法后,就会收到一封主题为Go MAIL,内容为**GO MAIL TEST!.**的邮件了。
总结
标准库的net/smtp包只是提供了最基础的功能,但是我们可以更具这些提供的基础功能来封装自己发送邮件的方法,比如实现线程邮件线程池等等功能