go實現定期發送郵件

1.首先安裝依賴包

安裝依賴包:
go get github.com/go-gomail/gomail
go get github.com/tealeg/xlsx

2.創建main.go


package main

import (
    "testing"
    "time"
    "github.com/tealeg/xlsx" //插件
    "log"
    "fmt"
)

func main() {
    serverHost := "smtp.qq.com"
    serverPort := 465
    fromEmail := "[email protected]"//發送者郵箱
    fromPasswd := "hzt...j"//  授權碼
    
    //myToers :="[email protected]"// "[email protected], [email protected]" 逗號隔開 接收者郵箱
    myCCers := "" //"[email protected]" 抄送
    
    subject := "這是主題"
    body := `這是正文<br>
            <h3>這是標題</h3>
             Hello <a href = "www.baidu.com">主頁</a><br>`
    
    //t.Logf("init email.\n")
    //InitEmail(myEmail)
    //SendEmail(subject, body)
   // TimeSettle(subject,body,myEmail)
   TimeSettle(subject,body,serverHost,fromEmail,fromPasswd,myCCers,serverPort)
}

func TimeSettle(subject,body,serverHost,fromEmail,fromPasswd,myCCers string,serverPort int) {
    //var myT string
    d := time.Duration(time.Minute)
    t := time.NewTicker(d)
    defer t.Stop()
    for {
        currentTime := time.Now()
        if currentTime.Minute() == 17 { // 每個小時中的第17分鐘
           // t.Logf("init email.\n")
           // InitEmail(myEmail)
           // SendEmail(subject, body)
           // time.Sleep(time.Minute)
            //讀取文件中的郵箱
            excelFileName := "C:/Users/huanggang/Desktop/fool.xlsx" //excel文件路徑
            fmt.Println(excelFileName)
            xlFile, err := xlsx.OpenFile(excelFileName)
            if err != nil {
                log.Panic(err)
            }
            for _, sheet := range xlFile.Sheets {
                for _, row := range sheet.Rows {
                    for _, cell := range row.Cells {
                        //fmt.Printf("%s\n", cell.String())
                        //讀取出內容後調用發郵件的代碼即可
                        //fmt.Println("1")

                        myToers :=cell.String()//append(myT,cell.String()):=cell.String()
                        // 結構體賦值
                        myEmail := &EmailParam {
                            ServerHost: serverHost,
                            ServerPort: serverPort,
                            FromEmail:  fromEmail,
                            FromPasswd: fromPasswd,
                            Toers:      myToers,
                            CCers:      myCCers,
                        }
//    發送郵件
                        InitEmail(myEmail)
                        SendEmail(subject, body)
                        //TimeSettle(subject,body,myEmail)
                    }
                }
            }
        }
        <-t.C
    }

}

3.創建goemail.go

package goemail

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

type EmailParam struct {
    // ServerHost 郵箱服務器地址,如騰訊企業郵箱爲smtp.exmail.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)
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章