发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增加新功能。于是乎出现了一些强大的第三方邮件库,今天推荐的这个库就是其中之一。

项目地址:https://github.com/jordan-wright/email,Star 数 1.3k+。

简介

email 包的设计易于使用,但又足够灵活以免受到限制。目的是为开发者提供友好的电子邮件接口。

该包当前支持以下功能:

  • From, To, Bcc, 和 Cc;

  • 邮件地址同时支持 "test@example.com" 和 "First Last test@example.com” 两种形式;

  • 正文支持普通文本和 HTML;

  • 附件支持;

  • 已读回馈;

  • 自定义协议头;

  • 。。。

快速使用

先安装:

$ go get github.com/jordan-wright/email

后使用,使用 Gmail 发送邮件:

e := email.NewEmail()
e.From = "Jordan Wright <test@gmail.com>"
e.To = []string{"test@example.com"}
e.Bcc = []string{"test_bcc@example.com"}
e.Cc = []string{"test_cc@example.com"}
e.Subject = "Awesome Subject"
e.Text = []byte("Text Body is, of course, supported!")
e.HTML = []byte("<h1>Fancy HTML is supported, too!</h1>")
e.Send("smtp.gmail.com:587", smtp.PlainAuth("", "test@gmail.com", "password123", "smtp.gmail.com"))
  • 通过 NewEmail 获取一个 Email 的实例;

  • From 设置发件人;

  • To 设置发给谁,支持多人;

  • Cc 设置抄送人,支持多人;

  • Bcc 设置抄送人,支持多人;

  • Subject 指定邮件标题;

  • Text 指定普通文本邮件正文;

  • HTML 指定 HTML 格式邮件正文;

  • 调用 Email 实例的 Send 方法进行邮件发送:第一个参数是 smtp 地址,第二个参数是 smtp.Auth 实例;

可见该库最终还是使用标准库 net/smtp 进行实际的邮件发送。

注意事项

  • From 中如果包含中文,比如:

e.From = "Go语言中文网<polaris@studygolang.com>”

收到的邮件不会显示发件人,有人提了一个 PR 支持 non-US-ASCII,但还未被 merge;根据该 PR 的提示,我们可以这样解决此问题:

e.From = mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<polaris@studygolang.com>"
  • 如果同时指定 Text 和 HTML,则 Text 的内容会被忽略;

  • 虽然默认情况下会尝试切换到 TLS,但如果想显示使用 TLS,则调用 Email#SendWithTLS 方法,具体代码如下:

tlsConfig := &tls.Config{InsecureSkipVerify: true,ServerName:         smtpHost,
}
e.SendWithTLS(addr, auth, tlsConfig)
  • 因为 Email 结构体的字段都是导出的,因此可以通过 &email.Email{} 这种形式创建实例,并直接为各个字段赋值;

带附件的邮件

如果邮件中需要带上附件,这个库很方便:

e.AttachFile("test.txt")

也可以是通过 io.Reader 读取文件:

func (e *Email) Attach(r io.Reader, filename string, c string) (a *Attachment, err error)

其中 filename 是放入附件显示的文件名,c 是 Content-Type,如果为空,则使用 application/octet-stream

重用连接

该库还支持连接池,例如:

p, err := email.NewPool("smtp.qq.com:25",4,smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
  • 第 2 个参数 4 表示最多开启 4 个连接

通过 p 的 Send 方法执行发送操作:

p.Send(e, 10e9)

完整例子如下:

package mainimport ("log""mime""net/smtp""net/textproto""strconv""sync""github.com/jordan-wright/email"
)func main() {var wg sync.WaitGroupch := make(chan *email.Email, 4)err := sendEmailByPool(ch, &wg)if err != nil {panic(err)}for i := 0; i < 4; i++ {wg.Add(1)ch <- &email.Email{To:      []string{"polaris@studygolang.com"},From:    mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<274768166@qq.com>",Subject: "Pool" + strconv.Itoa(i),HTML:    []byte("<h1>这是 HTML 正文</h1>"),Headers: textproto.MIMEHeader{},}}wg.Wait()close(ch)
}func sendEmailByPool(ch <-chan *email.Email, wg *sync.WaitGroup) error {p, err := email.NewPool("smtp.qq.com:25",4,smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))if err != nil {return err}for i := 0; i < 4; i++ {go func() {for e := range ch {err := p.Send(e, 10e9)if err != nil {log.Println("Send Email fail, err:", err)} else {log.Println("Send Email Successfully!")}wg.Done()}}()}return nil
}

总结

通过上面的介绍,你应该掌握了该库的使用,该库是不是满足了你对发邮件的需求?

最后附上一个完整的带附件的发邮件程序:

package mainimport ("log""mime""net/smtp""strings""github.com/jordan-wright/email"
)func main() {sendEmail("测试第三方 email 库", "xuxinhua@studygolang.com")
}func sendEmail(subject string, tos ...string) error {e := email.NewEmail()smtpUsername := "274768166@qq.com"e.From = mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<274768166@qq.com>"e.To = tose.Subject = subjecte.HTML = []byte("<h1>HTML 正文</h1>")e.AttachFile("zap.log")auth := smtp.PlainAuth("", smtpUsername, "password", "smtp.qq.com")err := e.Send("smtp.qq.com:25", auth)if err != nil {log.Println("Send Mail to", strings.Join(tos, ","), "error:", err)return err}log.Println("Send Mail to", strings.Join(tos, ","), "Successfully")return nil
}
  • 测试时注意将发件人、收件人和密码改为你自己的。

推荐阅读

  • Go每日一库之专为开发人员打造的调试日志库:what


喜欢本文的朋友,欢迎关注“Go语言中文网”:

Hi,我是轩脉刃,一个名不见经传码农,体制内的小愤青,躁动的骚年,2020年想坚持写一些学习/工作/思考笔记,谓之倒逼学习。欢迎关注个人公众号:轩脉刃的刀光剑影。

每日一库之Go 强大而灵活的电子邮件库:email相关推荐

  1. 值得推荐的C/C++框架和库 (真的很强大)

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  2. 天将 转:值得推荐的C/C++框架和库(真的很强大)

    转:值得推荐的C/C++框架和库(真的很强大) - 天将 - 博客园 天将 转:值得推荐的C/C++框架和库(真的很强大) 值得学习的C语言开源项目 - 1 Webbench - 2 Tinyhttp ...

  3. 强大的金融类图表库 TradingView 使用分享

    这段时间刚好做币圈交易所,运用到了现在最火的金融类图表库 -- TradingView ,就是强大,基本上现在的火币网(https://www.huobi.com),币安网(https://www.b ...

  4. Extjs 强大的WEB窗体开发库

    原文:Extjs 强大的WEB窗体开发库 作为一个javascript程序员,必须时刻关注JS的最新发展,想了解JS最新动态,可以关注我们的 Javascript教程网. 最近几年比较火的前端js框架 ...

  5. 功能强大的JavaScript 拖拽库 SortableJS

    功能强大的JavaScript 拖拽库 SortableJS 官网:http://www.sortablejs.com/ 示例: 配置项: var sortable = new Sortable(el ...

  6. flutterdio_强大的Flutter http请求库dio

    dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API.FormData.拦截器.请求取消.Cookie管理.文件上传/下载.超时等... 自dio开源至今, ...

  7. C# 矩阵库 功能特别强大!!

    文章目录 一个强大的C# 矩阵库 1. 矩阵库的中主要函数说明 2. 使用方法: 方法1:基于.dll 方法2:不需.dll 3. 使用示例: 一个强大的C# 矩阵库 接下来对一个特别厉害的矩阵库使用 ...

  8. iOS常用第三方库大全,史上最全第三方库收集

    下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableVie ...

  9. python爬虫库的功能_Python学习爬虫掌握的库资料大全和框架的选择的分析

    学Python,想必大家都是从爬虫开始的吧.毕竟网上类似的资源很丰富,开源项目也非常多. Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 当我们在浏览器中输入一个url后回车,后台会发生 ...

最新文章

  1. 检查网站是否可以正常访问
  2. Node.js调用ffmpeg处理视频
  3. ELK报错hese locations are not writable or multiple nodes were started without inc
  4. [深度学习] Keras 如何使用fit和fit_generator
  5. Mysql 字符操作函数相关
  6. 使有用计算机不注意卫生,保护眼睛注意细节有哪些
  7. c++基础学习(13)--(STL、标准库)
  8. 浏览器从输入URL到页面渲染过程 ——页面渲染流程
  9. MySQL性能调优my.cnf详解
  10. PyTorch 1.0 中文文档:多进程包 - torch.multiprocessing
  11. android真实项目教程(四)——MY APP MY STYLE_by_CJJ
  12. 《健康报》携手健康之路帮助医院医生免费搭建微官网
  13. 四省卫视联手办春晚 展现各地风俗年味
  14. 阵列matlab程序,阵列信号处理的理论和应用 原书matlab 程序.rar
  15. Qt ListView 刷新数据
  16. 吴翰清(道哥):我对计算的理解
  17. CAN:CAN矩阵、CAN网络、DBC、MDF关系
  18. 1312E Array Shrinking
  19. CV领域的对比学习综述(下)
  20. bboss es对比直接使用es客户端的优势

热门文章

  1. Microsoft Outlook 2019 for mac(电子邮件和日历工具) v16.45Beta中文激活版
  2. 【图像处理】基于matlab边缘检测 Sobel、Roberts、Prewitt
  3. .NET Core Onvif协议C#教程系列之XiaoFeng.Onvif组件库
  4. 618将至,各产品营销活动通用文案合集分享,有需要的进
  5. unity中通过代码控制游戏中画质
  6. Google Chrome谷歌浏览器崩溃,错误代码: STATUS_STACK_BUFFER_OVERRUN
  7. iPad上的数学软件介绍与畅想
  8. dicom 的mm换算成像素Pixel
  9. css中“~”(波浪号)、“,”(逗号)、 “ + ”(加号)和 “ ”(大于号)是什么意思?
  10. EasyExcel专题(一) Excel 读取、写入、上传和下载