Go 每日一庫之 email

熱烈歡迎你,相識是一種緣分,Echa 哥為了你的到來特意準備了一份驚喜,go學習資料《 》


Go 每日一庫之 email


簡介

程序中時常有發送郵件的需求。有異常情況了需要通知管理員和負責人,用戶下單後可能需要通知訂單信息,電商平臺、中國移動和聯通都有每月賬單,這些都可以通過郵件來推送。還有我們平時收到的垃圾郵件大都也是通過這種方式發送的。那麼如何在 Go 語言發送郵件?本文我們介紹一下email庫的使用。

快速使用

這個庫的使用快不了,為什麼呢?

先安裝庫,這個自不必說:

<code>$ go get github.com/jordan-wright/email
複製代碼/<code>

我們需要額外一些工作。我們知道郵箱使用SMTP/POP3/IMAP等協議從郵件服務器上拉取郵件。郵件並不是直接發送到郵箱的,而是郵箱請求拉取的。 所以,我們需要配置SMTP/POP3/IMAP服務器。從頭搭建固然可行,而且也有現成的開源庫,但是比較麻煩。現在一般的郵箱服務商都開放了SMTP/POP3/IMAP服務器。 我這裡拿 126 郵箱來舉例,使用SMTP服務器。當然,用 QQ 郵箱也可以。

  • 首先,登錄郵箱;
  • 點開頂部的設置,選擇POP3/SMTP/IMAP;
  • 點擊開啟IMAP/SMTP服務,按照步驟開啟即可,有個密碼設置,記住這個密碼,後面有用。

然後就可以編碼了:

<code>package main

import (
"log"
"net/smtp"

"github.com/jordan-wright/email"
)

func main() {
e := email.NewEmail()
e.From = "dj "
e.To = []string{"[email protected]"}
e.Subject = "Awesome web"
e.Text = []byte("Text Body is, of course, supported!")
err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "[email protected]", "yyy", "smtp.126.com"))
if err != nil {
log.Fatal(err)
}
}
複製代碼
/<code>

這裡為了我的信息安全,我把真實信息都隱藏了。代碼中xxx替換成你的郵箱賬號,yyy替換成上面設置的密碼。

代碼步驟比較簡單清晰:

  • 先調用NewEmail創建一封郵件;
  • 設置From發送方,To接收者,Subject郵件主題(標題),Text設置郵件內容;
  • 然後調用Send發送,參數1是 SMTP 服務器的地址,參數2為驗證信息。

運行程序將會向我的 QQ 郵箱發送一封郵件:


Go 每日一庫之 email


有的郵箱會把這種郵件放在垃圾箱中,例如 QQ。如果收件箱找不到,記得到垃圾箱瞅瞅。

抄送

平常我們發郵件的時候可能會抄送給一些人,還有一些人要秘密抄送,即 CC(Carbon Copy)和 BCC (Blind Carbon Copy)。 email我們也可以設置這兩個參數:

<code>package main

import (
"log"
"net/smtp"

"github.com/jordan-wright/email"
)

func main() {
e := email.NewEmail()
e.From = "dj "
e.To = []string{"[email protected]"}
e.Cc = []string{"[email protected]", "[email protected]"}
e.Bcc = []string{"[email protected]"}
e.Subject = "Awesome web"
e.Text = []byte("Text Body is, of course, supported!")
err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "[email protected]", "yyy", "smtp.126.com"))
if err != nil {
log.Fatal(err)
}
}
複製代碼
/<code>

還是一樣的,抄送的郵箱自己替換test1/test2/secret用自己的。

運行程序將會向我的 QQ 郵件發送一封郵件,同時抄送一封到我另一個 126 郵箱:


Go 每日一庫之 email


Go 每日一庫之 email


HTML 格式

發送純文本,郵件不太美觀。email支持發送 HTML 格式的內容。與發送純文本類似,直接設置對象的HTML字段:

<code>package main

import (
"log"
"net/smtp"

"github.com/jordan-wright/email"
)

func main() {
e := email.NewEmail()
e.From = "dj "
e.To = []string{"[email protected]"}
e.Cc = []string{"[email protected]"}
e.Subject = "Go 每日一庫"
e.HTML = []byte(`










`)
err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "[email protected]", "yyy", "smtp.126.com"))
if err != nil {
log.Fatal("failed to send email:", err)
}
}
複製代碼
/<code>

發送結果:


Go 每日一庫之 email


注意,126 的 SMTP 服務器檢測比較嚴格,加上 HTML 之後,很容易被識別為垃圾郵件不讓發送,這時 CC 自己就 OK 了。

附件

添加附件也很容易,直接調用AttachFile即可:

<code>package main

import (
"log"
"net/smtp"

"github.com/jordan-wright/email"
)

func main() {
e := email.NewEmail()
e.From = "dj "
e.To = []string{"[email protected]"}
e.Subject = "Go 每日一庫"
e.Text = []byte("請看附件")
e.AttachFile("test.txt")
err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "[email protected]", "yyy", "smtp.126.com"))
if err != nil {
log.Fatal("failed to send email:", err)
}
}
複製代碼
/<code>

收到的郵件:


Go 每日一庫之 email


連接池

實際上每次調用Send時都會和 SMTP 服務器建立一次連接,如果發送郵件很多很頻繁的話可能會有性能問題。email提供了連接池,可以複用網絡連接:

<code>package main

import (
"fmt"
"log"
"net/smtp"
"os"
"sync"
"time"

"github.com/jordan-wright/email"
)

func main() {
ch := make(chan *email.Email, 10)
p, err := email.NewPool(
"smtp.126.com:25",
4,
smtp.PlainAuth("", "[email protected]", "358942617ldj", "smtp.126.com"),
)

if err != nil {
log.Fatal("failed to create pool:", err)
}

var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
go func() {
defer wg.Done()
for e := range ch {
err := p.Send(e, 10*time.Second)
if err != nil {
fmt.Fprintf(os.Stderr, "email:%v sent error:%v\\n", e, err)
}

}
}()
}

for i := 0; i < 10; i++ {
e := email.NewEmail()
e.From = "dj <leedarjun>"
e.To = []string{"[email protected]"}
e.Subject = "Awesome web"
e.Text = []byte(fmt.Sprintf("Awesome Web %d", i+1))
ch }

close(ch)
wg.Wait()
}
複製代碼/<leedarjun>/<code>

上面程序中,我們創建 4 goroutine 共用一個連接池發送郵件,發送 10 封郵件後程序退出。為了等郵件都發送完成或失敗,程序才退出,我們使用了sync.WaitGroup。

郵箱被轟炸了:


Go 每日一庫之 email


由於使用了 goroutine,郵件順序不能保證。

總結

本文介紹瞭如何使用 Go 程序發送郵件,程序代碼都已經放在 。所有代碼都通過測試,大家請放心食用~

大家如果發現好玩、好用的 Go 語言庫,歡迎到 Go 每日一庫 GitHub 上提交 issue


分享到:


相關文章: