目錄
前言
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!")