Go語言傳送電子郵件

2020-07-16 10:05:06
電子郵件在日常工作中有很大用途,凡專案或任務,有郵件來往可避免扯皮背鍋。而在一些自動化的應用場合,也使用得廣泛,特別是系統監控方面,如果在資源使用達到警戒線之前自動發郵件通知運維人員,能消除隱患於前期,而不至於臨時臨急去做善後方案。

對於多人協合(不管是不是異地)場合,郵件也有用武之地,當有程式碼或文件更新時,自動發郵件通知專案成員或領導,提醒各方人員知曉並及時更新。

說到發郵件,不得不提用程式的方式實現。下面就來為大家介紹一下怎麼使用Go語言來實現傳送電子郵件。Go語言擁有大量的庫,非常方便使用。

Go語言使用 gomail 包來傳送郵箱,程式碼如下所示:
package main

import (
    "strings"
    "github.com/go-gomail/gomail"
)

type EmailParam struct {
    // ServerHost 郵箱伺服器地址,如騰訊郵箱為smtp.qq.com
    ServerHost string
    // ServerPort 郵箱伺服器埠,如騰訊郵箱為465
    ServerPort int
    // FromEmail 發件人郵箱地址
    FromEmail string
    // FromPasswd 發件人郵箱密碼(注意,這裡是明文形式),TODO:如果設定成密文?
    FromPasswd string
    // Toers 接收者郵件,如有多個,則以英文逗號(“,”)隔開,不能為空
    Toers string
    // CCers 抄送者郵件,如有多個,則以英文逗號(“,”)隔開,可以為空
    CCers string
}

// 全域性變數,因為發件人賬號、密碼,需要在傳送時才指定
// 注意,由於是小寫,外面的包無法使用
var serverHost, fromEmail, fromPasswd string
var serverPort int

var m *gomail.Message

func InitEmail(ep *EmailParam) {
    toers := []string{}
   
    serverHost = ep.ServerHost
    serverPort = ep.ServerPort
    fromEmail = ep.FromEmail
    fromPasswd = ep.FromPasswd
   
    m = gomail.NewMessage()
   
    if len(ep.Toers) == 0 {
        return
    }

    for _, tmp := range strings.Split(ep.Toers, ",") {
        toers = append(toers, strings.TrimSpace(tmp))
    }
   
    // 收件人可以有多個,故用此方式
    m.SetHeader("To", toers...)

    //抄送列表
    if len(ep.CCers) != 0 {
        for _, tmp := range strings.Split(ep.CCers, ",") {
            toers = append(toers, strings.TrimSpace(tmp))
        }
        m.SetHeader("Cc", toers...)
    }

    // 發件人
    // 第三個引數為發件人別名,如"李大錘",可以為空(此時則為郵箱名稱)
    m.SetAddressHeader("From", fromEmail, "")
}

// SendEmail body支援html格式字串
func SendEmail(subject, body string) {
    // 主題
    m.SetHeader("Subject", subject)
   
    // 正文
    m.SetBody("text/html", body)

    d := gomail.NewPlainDialer(serverHost, serverPort, fromEmail, fromPasswd)
    // 傳送
    err := d.DialAndSend(m)
    if err != nil {
        panic(err)
    }
}

func main() {
    serverHost := "smtp.qq.com"
    serverPort := 465
    fromEmail := "[email protected]"     //發件人郵箱
    fromPasswd := "xumkkzfscmxxxxxx"    //授權碼
   
    myToers := "[email protected]" // 收件人郵箱,逗號隔開
    myCCers := "" //"[email protected]"
   
    subject := "這是主題"
    body := `這是正文<br>
             Hello <a href = "http://c.biancheng.net/">C語言中文網</a>`
    // 結構體賦值
    myEmail := &EmailParam {
        ServerHost: serverHost,
        ServerPort: serverPort,
        FromEmail:  fromEmail,
        FromPasswd: fromPasswd,
        Toers:      myToers,
        CCers:      myCCers,
    }
   
    InitEmail(myEmail)
    SendEmail(subject, body)
}
使用自定義用戶端發放郵件需要以下兩個要素:

1) 傳送方的郵箱必須開啟 stmt 和 pop3 通道,以 qq 郵箱為例,登陸 qq 郵箱 -> 設定 -> 賬戶 -> 開啟 pop3 和 stmt 服務