文章目录

  • 使用 GOLANG 发送邮件
    • 邮件是什么?
    • 那么电子邮件又是个啥?
      • 电子邮件的优势是啥?
      • 电子邮件的形式是啥样的?
    • 邮件协议
    • 开始编码发邮件
      • 在 `QQ` 邮箱上面,拿到授权码
      • 编码,并安装`email` 邮件库
      • 发送`HTML`内容 + 附件
      • 如何提高发送邮件的性能
    • 总结
    • 欢迎点赞,关注,收藏

使用 GOLANG 发送邮件

我们一起来回顾一下上一次咱们说到的GO 的验证码案例

  • 验证码种类梳理
  • 验证码库的安装
  • 验证码库的源码介绍
  • 实操,编码
  • 验证码效果展示

想看看GO 咋做验证码的,欢迎查看文章 GO 的验证码案例

生活和工作中,咱们都离不开邮件的收发,要么在手机上查收和发送,要么在自己的电脑前面进行邮件编辑和处理

可是,我们会发现,很多时候,某类邮件,咱们每天都必须要在同一个时刻发出去,并且内容也是大同小异的,

而且,有时候因为各种各种各样的原因,不能准时的发送邮件,这个时候,咱们如果可以写一个定制化的发送邮件的程序那可以说还是很香的

那么,咱们还是先来看看一些基本的常识吧

邮件是什么?

邮件是指经传递方式处理的文件

邮件进行传递的过程称为邮递,而从事邮递服务的机构或系统,则称为邮政

邮件有国内邮件和国际邮件两类

那么电子邮件又是个啥?

电子邮件是—种用电子手段提供信息交换的通信方式是互联网应用最广的服务

电子邮件的优势是啥?

电子邮件依托于网络的电子邮件系统,有如下优势:

  • 价格非常低廉

不管发送到哪里,都只需负担网费

  • 传输快速

几秒钟之内可以发送到世界上任何指定的目的地,与世界上任何一个角落的网络用户联系

电子邮件的形式是啥样的?

  • 文字
  • 图像
  • 声音等

想一想每次发邮件都需要经历如下的步骤

  • 打开电脑
  • 进入浏览器
  • 打开电子邮件
  • 新建 - 编辑 - 发送

大部分内容还是复制粘贴的,

妥妥的一个工具人,好滴,现在就来看看 使用 GOLang 咋发邮件

邮件协议

咱们使用编程语言需要遵守编程语言的规范,我们在浏览器里面浏览网页也是一样,需要遵循各种网络协议

那么,我们发送邮件的必须也要先知道有哪些邮件协议可以使用,咱们都来列举一下

  • SMTP

SMTP是 简单邮件传输协议,是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式

另外 SMTP 协议属于TCP/IP协议簇

  • POP3

邮局协议的第3个版本,是因特网电子邮件的第一个离线协议标准

  • IMAP

是一种优于POP的新协议

POP一样,IMAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件

IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容

最终完成所有这些工作都不需要把邮件从服务器下载到用户的个人计算机上

OK,让我们开始进入到编码环节

开始编码发邮件

咱们今天就使用 SMTP 协议来发送邮件,有如下几个步骤

  • 在 QQ 邮箱上面,拿到授权码
  • 编码,并安装email 邮件库
  • 开始发送邮件

QQ 邮箱上面,拿到授权码

  • 进入 QQ邮箱,点击 设置 -> 账户

  • 下滑页面,看到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

  • 开启 POP3/SMTP服务
  • 开启 IMAP/SMTP服务
  • 生成授权码,这个授权码自己找地方保存起来

编码,并安装email 邮件库

咱们本次写的邮件小案例,用到的GO 的包是 "github.com/jordan-wright/email" , 我们可以这样来手动安装

 go get github.com/jordan-wright/email

不进行手动安装也没有问题,咱们可以现在看看 写一个初版的发送邮件小案例

package mainimport ("github.com/jordan-wright/email""log""net/smtp"
)func main() {// 简单设置 log 参数log.SetFlags(log.Lshortfile | log.LstdFlags)em := email.NewEmail()// 设置 sender 发送方 的邮箱 , 此处可以填写自己的邮箱em.From = "xx <xxx@qq.com>"// 设置 receiver 接收方 的邮箱  此处也可以填写自己的邮箱, 就是自己发邮件给自己em.To = []string{"xxx@qq.com"}// 设置主题em.Subject = "小魔童给你发邮件了"// 简单设置文件发送的内容,暂时设置成纯文本em.Text = []byte("hello world, 咱们用 golang 发个邮件!!")//设置服务器相关的配置err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "自己的邮箱账号", "自己邮箱的授权码", "smtp.qq.com"))if err != nil {log.Fatal(err)}log.Println("send successfully ... ")
}

运行上述代码的效果如下:

2021/06/xx xx:36:28 main.go:28: send successfully ...

说明发送邮件成功了,咱们来看看我们的邮箱

果然是发送成功了 , 窃喜

那么今天的文章分享就到这里了吧 ,这时你会问,我想发表格,想发html内容,还想发附件,甚至我想秘密抄送给某些人

好的安排

发送HTML内容 + 附件

咱们可以先来看看 这个库支持的哪些字段,上述NewEmail 方法时候返回一个指针

// NewEmail creates an Email, and returns the pointer to it.
func NewEmail() *Email {return &Email{Headers: textproto.MIMEHeader{}}
}

这个指针是指向了一个邮件的数据结构,咱们一起来瞅瞅

// Email is the type used for email messages
type Email struct {ReplyTo     []string    From        string       // 发送者To          []string      // 接收者Bcc         []string      // 密送Cc          []string       // 抄送Subject     string     // 主题Text        []byte // Plaintext message (optional)  HTML        []byte // Html message (optional)Sender      string // override From as SMTP envelope sender (optional)Headers     textproto.MIMEHeader  // 协议头Attachments []*Attachment    // 附件ReadReceipt []string
}

看了上述结构,咱们是不是发送邮件的时候,就可以抄送,密送,添加附件,或者发 HTML 的内容了呢 ,咱们改造一下上述的代码

func main() {// 简单设置l og 参数log.SetFlags(log.Lshortfile | log.LstdFlags)em := email.NewEmail()//设置发送方的邮箱em.From = "xx <xxx@qq.com>"// 设置接收方的邮箱em.To = []string{"xxx@qq.com"}// 抄送em.Cc = []string{"xxx@qq.com"}// 密送em.Bcc = []string{"xxx@qq.com"}//设置主题em.Subject = "小魔童给你发邮件了"//设置文件发送的内容em.HTML = []byte(`<h3><a href="https://juejin.cn/user/3465271329953806">欢迎来到小魔童哪吒的主页</a></h3>
<br/>
<table border="0" style="font-family: '微软雅黑 Light';" cellpadding="3px"><tr><td> 1 </td><td><a href="https://juejin.cn/post/6975686540601245709">GO 中 defer的实现原理</a></td></tr><tr><td> 2 </td><td><a href="https://juejin.cn/post/6975280009082568740">GO 中 Chan 实现原理分享</a></td></tr><tr><td> 3 </td><td><a href="https://juejin.cn/post/6974908615232585764">GO 中 map 的实现原理</a></td></tr><tr><td> 4 </td><td><a href="https://juejin.cn/post/6974539862800072718">GO 中 slice 的实现原理</a></td></tr><tr><td> 5 </td><td> <a href="https://juejin.cn/post/6974169270624190495">GO 中 string 的实现原理</a></td></tr><tr><td> 6 </td><td><a href="https://juejin.cn/post/6973793593987170317">GO 中 ETCD 的编码案例分享</a></td></tr><tr><td> 7 </td><td><a href="https://juejin.cn/post/6973455825905909797">服务注册与发现之ETCD</a></td></tr><tr><td> 8 </td><td> <a href="https://juejin.cn/post/6973108979777929230">GO通道和 sync 包的分享</a></td></tr><tr><td> 9 </td><td> <a href="https://juejin.cn/post/6972846349968474142">GO的锁和原子操作分享</a></td></tr>
</table>
`)// 添加附件em.AttachFile("./test.html")// 设置服务器相关的配置err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "自己的邮箱账号", "自己邮箱的授权码", "smtp.qq.com"))if err != nil {log.Fatal(err)}log.Println("send successfully ... ")
}

运行之后,咱们去查收一下邮件

抄送,密送,添加附件,发送 HTML 内容,全部满上

如何提高发送邮件的性能

get github.com/jordan-wright/email 包里面为我们提供了连接池,你就说香不香,咱们可以复用上一次的网络连接来发送邮件,而不是每发送一次邮件,就建立一次连接

我们都知道,建立连接是会耗费时间和资源的,咱们得尽可能的优化

再来一个DEMO,连接池的,咱们运用连接池,创建 一个 有 5 个缓冲的通道,让 3 个协程去通道里面获取数据,然后发送邮件

func main() {// 简单设置l og 参数log.SetFlags(log.Lshortfile | log.LstdFlags)// 创建有5 个缓冲的通道,数据类型是  *email.Emailch := make(chan *email.Email, 5)// 连接池p, err := email.NewPool("smtp.qq.com:25",3,    // 数量设置成 3 个smtp.PlainAuth("", "自己的邮箱", "自己邮箱的授权码", "smtp.qq.com"),)if err != nil {log.Fatal("email.NewPool error : ", err)}// sync 包,控制同步var wg sync.WaitGroupwg.Add(3)for i := 0; i < 3; i++ {go func() {defer wg.Done()// 若 ch 无数据,则阻塞, 若 ch 关闭,则退出循环for e := range ch {// 超时时间 10 秒err := p.Send(e, 10*time.Second)if err != nil {log.Printf( "p.Send error : %v , e = %v , i = %d\n", err , e, i)}}}()}for i := 0; i < 5; i++ {e := email.NewEmail()// 设置发送邮件的基本信息e.From = "xx <xxx@qq.com>"e.To = []string{"xxx@qq.com"}e.Subject = "test email.NewPool " + fmt.Sprintf("  the %d email",i)e.Text = []byte(fmt.Sprintf("test email.NewPool , the %d email !", i))ch <- e}// 关闭通道close(ch)// 等待子协程退出wg.Wait()log.Println("send successfully ... ")
}

运行上述代码后,咱们查看邮箱

咱们可以看到,邮件并不是按照顺序发送出来的,这就对了

要是对于上述的sync 使用有疑问的话, 欢迎查看文章GO通道和 sync 包的分享

总结

  • 分享了邮件,电子邮件是什么
  • 邮件协议有哪些
  • 如何使用GOLANG 发送电子邮件
  • 发送电子邮件如何携带纯文本,HTML内容,附件等
  • 发送邮件,如何抄送,如何密送
  • 如何提高发送邮件的性能

之前我们也简单分享了GOLANG如何发送邮件,大家可以对比一下,哪一种更加方便golang如何发送邮件(qq邮箱) |Go主题月

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里,下一次 分享一波GO的爬虫

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

使用 GOLANG 发送邮件相关推荐

  1. 使用golang发送邮件,报错“x509: certificate signed by unknown authority”

    问题描述 使用golang发送邮件,报错"x509: certificate signed by unknown authority",这是由于客户端默认要对服务端传过来的数字证书 ...

  2. golang如何发送邮件(qq邮箱)

    文章目录 golang发送邮件(qq邮箱) 前期准备 代码编写 效果展示 golang发送邮件(qq邮箱) 前期准备 golang发送邮件的功能,我们今天介绍golang发送qq邮件,相信大家都有qq ...

  3. GO(golang)语言使用SMTP发送电子邮件,简单和复杂带附件cc,bcc

    转https://studygolang.com/articles/2098 核心代码:smtp.SendMail(host, auth, user, send_to, msg),auth := sm ...

  4. GO 发送邮件,官方连包都帮我们写好了

    GO 发送邮件,官方连包都帮我们写好了,真是贴心啊!!!,突然间感觉php不香了... package mainimport ("fmt""net/smtp"& ...

  5. Golang Study

    安装 下载第三方包 - Golang中国 IDEA IDEA写Golang的一些操作/技巧 - 冥灭 - SegmentFault 亲测可用!!!golang如何在idea中保存时自动进行代码格式化 ...

  6. golang 使用ssl连接smtp发送邮件

    发送邮件的流程是,先有一个邮件发送器,然后才能发邮件.对于发送器,可以用qq来申请成可以发邮件测试代码 https://jingyan.baidu.com/article/4b07be3cb2f741 ...

  7. Golang入门教程(二)Ubuntu16.04下安装golang(实例:Golang 定时任务管理器)

    通过两种方式安装 一.通过apt-get安装 1.安装 sudo apt-get install golang 2.设置GOPATH变量 GOPATH是扩展库的目录,Go先搜索标准库目录,然后搜索GO ...

  8. golang+数据库定时任务

    2019独角兽企业重金招聘Python工程师标准>>> golang+数据库定时任务 项目背景大致如下,楼主在用nodejs写项目时遇到一些需要定时去处理的事情,例如僵尸用户定时清除 ...

  9. golang中文文档_【译】Go 语言源码贡献官方指导文档

    以前给 Go 语言项目源码提交过一些 commits,期间阅读他们的官方指导文档的时候觉得这篇指导文档可以作为绝佳的关于大型软件项目的规范管理的参考,因为最近又提交了几个 commits,就又把这篇文 ...

最新文章

  1. 理解数据类型与数学运算:求和、温度转换
  2. Word2016如何取消宏已被禁用的提示
  3. 河马php一句话木马,一句话木马的套路
  4. 计划策略-52-没有最终装配和没有MTO的计划
  5. 【转】Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱
  6. Java Web 项目目录规范
  7. php数据库数组去重复数据库,PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)...
  8. Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...
  9. 讲100个科学道理,不如做这些有趣的理科实验!
  10. MySQL DDL语言笔记
  11. Nagios Plugin for Cacti (npc插件) Download 下载
  12. 不同程序语言的注释和变量要求
  13. linux系统 安卓系统安装教程,Linux系统下安装android sdk的方法步骤
  14. 移动端日期选择,下拉框选择效果
  15. 布同:vim插件开发实例和讲解
  16. 跳频通信(梅文华)pdf
  17. java12安装和配置_JDK12 安装和环境变量配置
  18. 如何录制游戏视频?游戏录制软件推荐
  19. 阿里云香港服务器和大陆服务器区别及选择
  20. 常见错误:无效的文件dsn

热门文章

  1. android 文本输入区域,android – 键盘模糊输入文本区域
  2. 321,京东言犀×NLPCC 2022挑战赛开赛
  3. ModelWhale 云端运行 WRF 中尺度数值气象模式,随时随地即开即用的一体化工作流
  4. DM数据库安装过程--基于NeoKylin操作系统详解
  5. 蓝桥杯.剪邮票(DFS)
  6. 电脑现在找不到驱动器,设备管理器显示DVD/CD-ROM驱动器是黄色感叹号
  7. vs code 配置 git完整
  8. 360浏览器(极速)如何导出保存的账号密码
  9. 枚举类中获取枚举值的几种方法
  10. CSS“隐藏”元素的几种方法的对比