电子邮件在日常工作中有很大用途,凡项目或任务,有邮件来往可避免扯皮背锅。
而在一些自动化的应用场合,也使用得广泛,特别是系统监控方面,如果在资源使用达到警戒线之前自动发邮件通知运维人员,能消除隐患于前期,而不至于临时临急去做善后方案。
对于多人协合(不管是不是异地)场合,邮件也有用武之地,当有代码或文档更新时,自动发邮件通知项目成员或领导,让各方人员知晓并及时更新(是否更新,取决于人,而非工具)。
说到发邮件,不得不提用程序的方式实现。笔者之前已经开通了腾讯免费企业邮箱,并关联自己的域名,自己注册了些邮箱来测试。
本文使用golang语言实现发送电子邮件。
golang拥有大量的库,非常方便使用。说到golang,不提不提笔者那段探索docker、k8s的岁月,这些项目都是用golang实现的,于是不可避免地要学习一下golang。但只限于“一下”而已。
实现
golang使用gomail来发送邮箱,参考一些资料,很容易实现功能。
源码文件goemail.go如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| 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如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| /* 安装依赖包: 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修改为实际值。
安装依赖包:
1
| go get github.com/go-gomail/gomail
|
直接运行:
即可。
本文源码可在https://github.com/latelee/goemail找到。
过了半年的PS:近期笔者邮箱收到了许多测试邮件,如果使用本文示例,请修改myToers
为自己想接收的邮件地址,另外请勿修改fromEmail
邮件密码。另外,也有部分同志在测试中写了些不和谐的文字,请勿如此。
再过半年的PPS:近期经常收到测试邮件,对工作生活造成一定干扰,麻烦大家一定要修改接收邮件。否则我会修改邮件密码,本文示例无法直接使用。
李迟 2019.1.15 中午