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)
    }
}

发布了36 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40098405/article/details/103335582