方法 1,使用官方的 net/smtp
庫
package main
import (
"log"
"net/smtp"
)
const (
SMTPHost = "smtp.gmail.com"
SMTPPort = ":587"
SMTPUsername = "xxx@gmail.com"
SMTPPassword = "xxxx"
)
func sendEmail(receiver string) {
auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
msg := []byte("Subject: 這里是標題內容\r\n\r\n" + "這里是正文內容\r\n")
err := smtp.SendMail(SMTPHost+SMTPPort, auth, SMTPUsername, []string{receiver}, msg)
if err != nil {
log.Fatal("failed to send email:", err)
}
}
func sendHTMLEmail(receiver string, html []byte) {
auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
msg := append([]byte("Subject: 這里是標題內容\r\n"+
"MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\r\n\r\n"),
html...)
err := smtp.SendMail(SMTPHost+SMTPPort, auth, SMTPUsername, []string{receiver}, msg)
if err != nil {
log.Fatal("failed to send email:", err)
}
}
func main() {
sendHTMLEmail("接受者@gmail.com", []byte("<html><h2>這是網頁內容</h2></html>"))
}
方法2. 使用 jordan-wright 庫
package main
import (
"log"
"fmt"
"net/smtp"
"github.com/jordan-wright/email"
)
const (
SMTPHost = "smtp.gmail.com"
SMTPPort = ":587"
SMTPUsername = "xxx@gmail.com"
SMTPPassword = "xxxx"
)
func sendEmail(receiver string) {
auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
e := &email.Email{
From: fmt.Sprintf("發送者名字<%s>", SMTPUsername),
To: []string{receiver},
Subject: "這里是標題內容",
Text: []byte("這里是正文內容"),
}
err := e.Send(SMTPHost+SMTPPort, auth)
if err != nil {
log.Fatal(err)
}
}
func sendHTMLEmail(receiver string, html []byte) {
auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
e := &email.Email{
From: fmt.Sprintf("發送者名字<%s>", SMTPUsername),
To: []string{receiver},
Subject: "這里是標題內容",
HTML: html,
}
err := e.Send(SMTPHost+SMTPPort, auth)
if err != nil {
log.Fatal(err)
}
}
func main() {
sendHTMLEmail("接受者@gmail.com", []byte("<html><h2>這是網頁內容</h2></html>"))
}
方法3. 使用 jordan-wright 庫的 Pool
package main
import (
"log"
"fmt"
"time"
"net/smtp"
"github.com/jordan-wright/email"
)
const (
SMTPHost = "smtp.gmail.com"
SMTPPort = ":587"
SMTPUsername = "xxx@gmail.com"
SMTPPassword = "xxxx"
MaxClient = 5
)
var pool *email.Pool
func sendEmail(receiver string) {
var err error
if pool == nil {
pool, err = email.NewPool(SMTPHost+SMTPPort, MaxClient, smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost))
if err != nil {
log.Fatal(err)
}
}
e := &email.Email{
From: fmt.Sprintf("發送者名字<%s>", SMTPUsername),
To: []string{receiver},
Subject: "這里是標題內容",
Text: []byte("這里是正文內容"),
}
err = pool.Send(e, 5 * time.Second)
if err != nil {
log.Fatal(err)
}
}
對比總結
如果只是發送少量郵件,可以使用前兩種方法。但是如果需要一次性發送較多郵件,需要使用第三種方法,即連接池。