使用golang发送电子邮件

电子邮件在日常工作中有很大用途,凡项目或任务,有邮件来往可避免扯皮背锅(是否背锅,取决于人,而非邮件)。
而在一些自动化的应用场合,也使用得广泛,特别是系统监控方面,如果在资源使用达到警戒线之前自动发邮件通知运维人员,能消除隐患于前期,而不至于临时临急去做善后方案。
对于多人协合(不管是不是异地)场合,邮件也有用武之地,当有代码或文档更新时,自动发邮件通知项目成员或领导,让各方人员知晓并及时更新(是否更新,取决于人,而非工具)。
说到发邮件,不得不提用程序的方式实现。笔者之前已经开通了腾讯免费企业邮箱,并关联自己的域名,自己注册了些邮箱来测试。

本文使用golang语言实现发送电子邮件。

golang拥有大量的库,非常方便使用。说到golang,不提不提笔者那段探索docker、k8s的岁月,这些项目都是用golang实现的,于是不可避免地要学习一下golang。但只限于“一下”而已。
实现

golang使用gomail来发送邮箱,参考一些资料,很容易实现功能。
源码文件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)
    }
}


    
 

测试

测试文件goemail_test.go如下:

/*
安装依赖包:
go get github.com/go-gomail/gomail

测试命令:
go test 
*/
package goemail

import (
    "testing"
)

func TestEmail(t *testing.T) {
    serverHost := "smtp.exmail.qq.com"
    serverPort := 465
    fromEmail := "cicd@latelee.org"
    fromPasswd := "1qaz@WSX"
    
    myToers := "li@latelee.org, latelee@163.com" // 逗号隔开
    myCCers := "" //"readchy@163.com"
    
    subject := "这是主题"
    body := `这是正文<br>
            <h3>这是标题</h3>
             Hello <a href = "http://www.latelee.org">主页</a><br>`
    // 结构体赋值
    myEmail := &EmailParam {
        ServerHost: serverHost,
        ServerPort: serverPort,
        FromEmail:  fromEmail,
        FromPasswd: fromPasswd,
        Toers:      myToers,
        CCers:      myCCers,
    }
    t.Logf("init email.\n")
    InitEmail(myEmail)
    SendEmail(subject, body)
}


 

测试时注意将源码的fromEmail、fromPasswd、myToers修改为实际值。
安装依赖包:

go get github.com/go-gomail/gomail

 

直接运行:

go test

 

即可。

本文源码可在https://github.com/latelee/goemail找到。

过了半年的PS:近期笔者邮箱收到了许多测试邮件,如果使用本文示例,请修改myToers为自己想接收的邮件地址,另外请勿修改fromEmail邮件密码。另外,也有部分同志在测试中写了些不和谐的文字,请勿如此。
————————————————
版权声明:本文为CSDN博主「李迟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/subfate/article/details/86491032

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值