目录
前言
Go原生包net/smtp可以实现基本的发送邮件功能。Go的第三方包gomail可以实现更多的发送功能。下面来一一介绍。
获取授权码
部分邮箱(例如QQ邮箱)发送邮件时,使用的不是密码,而是授权码。授权码的获取方式(以QQ邮箱为例)如下:
使用Go原生smtp包发送邮件
所需导入包
需要使用 net/smtp 包
import (
"net/smtp"
)
身份、发送者和密码
identity := ""
sender := "[email protected]"
pwd := "lzffxekpzhuazsfeagb2"
⚠️发送者sender必须是合法有效的邮箱。有些邮箱发送时需要的是授权码,而非密码。因此需要将pwd的值替换为授权码。
stmp域名和端口
host :="smtp.qq.com"
port := "25"
使用QQ邮箱作为发送者邮箱时,域名和端口如上配置。
接收者切片
可以一次性发送给多个用户:
sendTo:=[]string{"[email protected]", "[email protected]"}
发送者名称
senderName := "TCatTime"
定义邮件发送者的名字。
标题和正文
title := "have a nice day"
body := "test8.0"
定义邮件的标题和正文内容。
生成授权
调用smtp包中的PlainAuth函数,生成授权。
auth := smtp.PlainAuth(identity, sender, pwd, host)
指定上下文类型
content_type := "Content-Type: text/html; charset=UTF-8"
拼接发送消息和url
msg := []byte("To: " + strings.Join(sendTo, ",",) + "\nFrom: " + senderName +
"<" + sender + ">\nSubject: " + title + "\n" + content_type + "\n" + body + "\n")
url := host + ":" + port
发送邮件
err := smtp.SendMail(url, auth, sender, sendTo, msg)
if err != nil {
fmt.Printf("\n\nsend mail error: %v", err)
return
}
fmt.Println("\n\nsend mail success!")
发送邮件实测
使用第三方包----gomail
gomail简单介绍
gomail框架对go原生的smtp包做了一层封装,使用更直观、简便。且gomail可以更方便的发送带有附件的邮件、添加抄送者等。
获取gomail
1、使用go-get获取
github.com/go-gomail/gomail
2、使用go-mod获取
进入项目目录下
go mod tidy
生成gomail message
m := gomail.NewMessage()
设置发件人信息
m.SetAddressHeader("From", "[email protected]", "发件人")
设置收件人信息
m.SetHeader("To",
m.FormatAddress("[email protected]", "收件人"))
设置抄送者信息
m.SetHeader("Cc",
m.FormatAddress("[email protected]", "收件人1"),
m.FormatAddress("[email protected]", "收件人2"))
设置密送者信息
m.SetHeader("Bcc",
m.FormatAddress("[email protected]", "收件人1"),
m.FormatAddress("[email protected]", "收件人2"))
设置邮件主题
m.SetHeader("Subject", "go-mail测试")
SetHeader方法的第一个参数表示邮件标题(Subject),第二个参数表示邮件主题(go-mail测试)。
书写正文内容
m.SetBody("Content-Type: text/html; charset=UTF-8", "go-mail")
SetBody()方法的第一个参数表示正文内容的类型和默认的编码格式。第二个参数是正文内容。
添加附件
m.Attach("/Users/root/Desktop/demo.docx")
使用Attach()方法添加一个附件到邮件中。附件的路径为服务器端的绝对路径。
设置拨号器
发送邮件的最后一项准备工作是设置拨号器。使用NewDialer()函数生成一个拨号器。将邮件服务器、端口、发送者邮箱、密码(或授权码)依次传入NewDialer()函数中。以QQ邮箱为例:
d := gomail.NewDialer("smtp.qq.com", 25, "[email protected]", "lzfxkkpzuasfeagz")
🚀发送邮件~
最后一步,发送!
err := d.DialAndSend(m)
if err != nil {
fmt.Println("send mail error:", err.Error())
return
}
fmt.Println("Send mail finished!")