Go 每日一库之 email

go邮件发送 依赖安装 go get gopkg.in/gomail.v2 示例目录结构 email | demo.go //示例文件 | email | email.go //lib文件 需要修改相应的smtp配置 详细内容如下: demo.go代码: package main import ( "./email" ) func main () { msg := m... 阅读详情

简介

程序中时常有发送邮件的需求。有异常情况了需要通知管理员和负责人,用户下单后可能需要通知订单信息,电商平台、中国移动和联通都有每月账单,这些都可以通过邮件来推送。还有我们平时收到的垃圾邮件大都也是通过这种方式发送的😭。那么如何在 Go 语言发送邮件?本文我们介绍一下email库的使用。

快速使用

这个库的使用快不了,为什么呢?

先安装库,这个自不必说:

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

我们需要额外一些工作。我们知道邮箱使用SMTP/POP3/IMAP等协议从邮件服务器上拉取邮件。邮件并不是直接发送到邮箱的,而是邮箱请求拉取的。
所以,我们需要配置SMTP/POP3/IMAP服务器。从头搭建固然可行,而且也有现成的开源库,但是比较麻烦。现在一般的邮箱服务商都开放了SMTP/POP3/IMAP服务器。
我这里拿 126 邮箱来举例,使用SMTP服务器。当然,用 QQ 邮箱也可以。

  • 首先,登录邮箱;
  • 点开顶部的设置,选择POP3/SMTP/IMAP;
  • 点击开启IMAP/SMTP服务,按照步骤开启即可,有个密码设置,记住这个密码,后面有用。

然后就可以编码了:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Subject = "Awesome web"
  e.Text = []byte("Text Body is, of course, supported!")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal(err)
  }
}

这里为了我的信息安全,我把真实信息都隐藏了。代码中xxx替换成你的邮箱账号,yyy替换成上面设置的密码。

代码步骤比较简单清晰:

  • 先调用NewEmail创建一封邮件;
  • 设置From发送方,To接收者,Subject邮件主题(标题),Text设置邮件内容;
  • 然后调用Send发送,参数1是 SMTP 服务器的地址,参数2为验证信息。

运行程序将会向我的 QQ 邮箱发送一封邮件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXgqRYoR-1581903048970)(https://darjun.github.io/img/in-post/godailylib/email1.png#center)]

有的邮箱会把这种邮件放在垃圾箱中,例如 QQ😭。如果收件箱找不到,记得到垃圾箱瞅瞅。

抄送

平常我们发邮件的时候可能会抄送给一些人,还有一些人要秘密抄送😄,即 CC(Carbon Copy)和 BCC (Blind Carbon Copy)。
email我们也可以设置这两个参数:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Cc = []string{"test1@126.com", "test2@126.com"}
  e.Bcc = []string{"secret@126.com"}
  e.Subject = "Awesome web"
  e.Text = []byte("Text Body is, of course, supported!")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal(err)
  }
}

还是一样的,抄送的邮箱自己替换test1/test2/secret用自己的。

运行程序将会向我的 QQ 邮件发送一封邮件,同时抄送一封到我另一个 126 邮箱:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDwp9Ltq-1581903048971)(https://darjun.github.io/img/in-post/godailylib/email2.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtShWeOw-1581903048972)(https://darjun.github.io/img/in-post/godailylib/email3.png)]

HTML 格式

发送纯文本,邮件不太美观。email支持发送 HTML 格式的内容。与发送纯文本类似,直接设置对象的HTML字段:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Cc = []string{"xxx@126.com"}
  e.Subject = "Go 每日一库"
  e.HTML = []byte(`
  <ul>
<li><a "https://darjun.github.io/2020/01/10/godailylib/flag/">Go 每日一库之 flag</a></li>
<li><a "https://darjun.github.io/2020/01/10/godailylib/go-flags/">Go 每日一库之 go-flags</a></li>
<li><a "https://darjun.github.io/2020/01/14/godailylib/go-homedir/">Go 每日一库之 go-homedir</a></li>
<li><a "https://darjun.github.io/2020/01/15/godailylib/go-ini/">Go 每日一库之 go-ini</a></li>
<li><a "https://darjun.github.io/2020/01/17/godailylib/cobra/">Go 每日一库之 cobra</a></li>
<li><a "https://darjun.github.io/2020/01/18/godailylib/viper/">Go 每日一库之 viper</a></li>
<li><a "https://darjun.github.io/2020/01/19/godailylib/fsnotify/">Go 每日一库之 fsnotify</a></li>
<li><a "https://darjun.github.io/2020/01/20/godailylib/cast/">Go 每日一库之 cast</a></li>
</ul>
  `)
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal("failed to send email:", err)
  }
}

发送结果:

注意,126 的 SMTP 服务器检测比较严格,加上 HTML 之后,很容易被识别为垃圾邮件不让发送,这时 CC 自己就 OK 了。

附件

添加附件也很容易,直接调用AttachFile即可:

package main

import (
  "log"
  "net/smtp"

  "github.com/jordan-wright/email"
)

func main() {
  e := email.NewEmail()
  e.From = "dj <xxx@126.com>"
  e.To = []string{"935653229@qq.com"}
  e.Subject = "Go 每日一库"
  e.Text = []byte("请看附件")
  e.AttachFile("test.txt")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal("failed to send email:", err)
  }
}

收到的邮件:

连接池

实际上每次调用Send时都会和 SMTP 服务器建立一次连接,如果发送邮件很多很频繁的话可能会有性能问题。email提供了连接池,可以复用网络连接:

package main

import (
  "fmt"
  "log"
  "net/smtp"
  "os"
  "sync"
  "time"

  "github.com/jordan-wright/email"
)

func main() {
  ch := make(chan *email.Email, 10)
  p, err := email.NewPool(
    "smtp.126.com:25",
    4,
    smtp.PlainAuth("", "leedarjun@126.com", "358942617ldj", "smtp.126.com"),
  )

  if err != nil {
    log.Fatal("failed to create pool:", err)
  }

  var wg sync.WaitGroup
  wg.Add(4)
  for i := 0; i < 4; i++ {
    go func() {
      defer wg.Done()
      for e := range ch {
        err := p.Send(e, 10*time.Second)
        if err != nil {
          fmt.Fprintf(os.Stderr, "email:%v sent error:%v\n", e, err)
        }
      }
    }()
  }

  for i := 0; i < 10; i++ {
    e := email.NewEmail()
    e.From = "dj <leedarjun@126.com>"
    e.To = []string{"935653229@qq.com"}
    e.Subject = "Awesome web"
    e.Text = []byte(fmt.Sprintf("Awesome Web %d", i+1))
    ch <- e
  }

  close(ch)
  wg.Wait()
}

上面程序中,我们创建 4 goroutine 共用一个连接池发送邮件,发送 10 封邮件后程序退出。为了等邮件都发送完成或失败,程序才退出,我们使用了sync.WaitGroup。

邮箱被轰炸了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rm5FRAej-1581903048974)(https://darjun.github.io/img/in-post/godailylib/email6.png#center)]

由于使用了 goroutine,邮件顺序不能保证。

总结

本文介绍了如何使用 Go 程序发送邮件,程序代码都已经放在 GitHub 上https://github.com/darjun/go-daily-lib/tree/master/email。所有代码都通过测试,大家请放心食用~

大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue😄

参考

  1. email GitHub:https://github.com/jordan-wright/email
  2. Go 每日一库 GitHub:https://github.com/darjun/go-daily-lib

我

我的博客

欢迎关注我的微信公众号【GoUpUp】,共同学习,一起进步~

本文由博客一文多发平台 OpenWrite 发布!

Go语言中的简单邮件发送实践:goemail库使用指南 goemail是Go语言的一个库,它提供了简单易用的API来发送邮件。这个库支持SMTP协议,可以轻松集成到任何Go应用程序中,无论是Web应用还是命令行工具。简单邮件传输协议(SMTP)是用于电子邮件传输的标准协议。它定义了邮件服务器之间以及邮件客户端和服务器之间的交互规则。SMTP工作在TCP/IP协议之上,通常在端口25、465(SSL)或587(TLS)上运行。SMTP服务器处理邮件的发送和中继,而接收邮件则通常由其他协议(如IMAP或POP)负责。 阅读详情

相关推荐

goemail:go语言简单发送邮件,不支持附件,可以发送验证码,通知等

goemail:go语言简单发送邮件,不支持附件,可以发送验证码,通知等

Go语言库系列之email

导读 大家好我是平也,今天跟大家介绍一款用来发送邮件的Go语言库email,目前星星1.3k,非常好用。 极速上手 准备工作 初始化项目 go get github.com/jordan-wright/email 本示例项目结构 . ├── go.mod ├── go.sum └── main.go 开启邮箱SMTP服务,以163邮箱为例,需要先登录到邮箱后台点击开启按钮,在发送完短信之后,会获取到一个授权码,将授权码保存,后面需要用到。 代码示例 首先配置好邮件内容 e := email...

深蓝旭的博客 3856

用于电子邮件验证的Go库,无需发送任何电子邮件。-Golang开发

email-verifier:envelope:一个Go库,用于在不发送任何电子邮件的情况下进行电子邮件验证。 功能电子邮件地址验证:验证字符串是否包含电子邮件验证程序:envelope:一个Go库,用于进行电子邮件验证而不发送任何电子邮件。 功能电子邮件地址验证:验证字符串是否包含有效的电子邮件。 通过SMTP进行电子邮件验证查找:对传递的电子邮件MX验证执行电子邮件验证:检查DNS MX记录中给定域名的其他验证:包括免费电子邮件提供商检查,角色帐户验证,一次性电子邮件地址(DEA)验证电子邮件可达性:检查对仙蒂的信心

50.Go实现邮件发送

程序中时常有发送通知的需求。有异常情况了需要通知管理员和负责人,用户下单后可能需要通知订单信息,电商平台、中国移动和联通都有每月账单,这些都可以通过飞书、微信、钉钉、短信或者邮件来推送。之前我们已经介绍过如果发送飞书消息7. 飞书机器人发送交互式信息,本次我们介绍下如何发送邮件,其实我们平时收到的垃圾邮件大都也是通过这种方式发送的。那么如何在Go语言发送邮件?本文我们介绍一下email库的使用。

YouMing_Li的博客 3180

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 587

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8438

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

发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增...

轩脉刃的刀光剑影 1万+

尚硅谷 Vue2.0 + Vue3.0 入门到精通教程学习笔记 (一)

本文为总结尚硅谷Vue2.0+Vue3.0 的学习笔记系列的第一章——Vue的核心,包含Vue简介、模板语法、数据绑定、MVVM模型、事件处理,计算属性与监视、class与style绑定、列表渲染、过滤器、内置指定和自定义指令以及Vue生命周期等知识点

weixin_44566194的博客 3655

go获取byte_每日一库之Go 强大而灵活的电子邮件库:email

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习Go语言发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增加新功能。于是乎出现了一些强大的第三方邮件库,今天推荐的这个库就是其中之一。项目地址:https://github.com/jo...

weixin_36236823的博客 4107

Allegro格式PCB转换成Pads操作指导

变量:AEX_BIN_ROOT 值:D: MentorGraphics>PADSVX1.2>SDD_HOME>translators>win32bin (值:软件按装的位置,可以是9.5版本,也可以是VX1.0等不同的版本)。变量:HOME 值:C:Users>win7>AppData>Roaming>SPB_Data (这个值是allegro快捷键存放位置器,也可以随意放置在那个盘,我们可以采用默认的路径)。第4步:打开 PADSLayout软件,然后选择导入文件,选择刚刚处理的 allegro文件。

weixin_54787054的博客 3717

使用 Python 构建 Reddit 热帖爬虫:抓取热门讨论帖和评论

在现代互联网中,Reddit 被誉为全球最大、最活跃的讨论平台之一,汇聚了各种主题的帖子、评论和社交互动。因此,抓取 Reddit 上的热门帖子和评论可以为我们提供一个丰富的文本数据源,可以用于情感分析、话题建模、趋势分析等应用。Reddit 提供了官方的 API,可以让开发者获取包括帖子、评论、用户信息等在内的各种数据。我们可以结合上述方法,抓取多个热门帖子,并将每个帖子的标题、作者、发布时间和评论内容保存到一个数据结构中。每个帖子的对象包含了丰富的信息,如标题、内容、发布时间、作者等。

2201_76125261的博客 382

gmail api 发送邮件_每日一库之Go 强大而灵活的电子邮件库:email

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增加新功能。于是乎出现了一些强大的第三方邮件库,今天推荐的这个库就是其中之一。项目地址:https://github.com/jordan-...

weixin_39558317的博客 4670

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署

YOLO(You Only Look Once)系列算法因其高效、准确等特点而备受瞩目。由2023年Ultralytics公司发布了YOLO的最新版本YOLOv8是结合前几代YOLO的基础上的一个融合改进版。本文YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署,从网络结构的讲解从模型的网络结构讲解到模型的部署都有详细介绍,同时在本专栏中还包括YOLOv8模型系列的改进包括个人提出的创新点,传统卷积、注意力机制、损失函数的修改教程,能够帮助你的论文获得创新点。

Snu77的博客 8万+

golang 日志分析_每日一库之 logrus 日志使用教程

点击上方蓝色“Go语言中文网”关注,回复「电子书」领全套Go资料golang 日志库 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持. 所以催生了很多第三方的日志库,但是在 golang 的世界里,没有一个日志库像 slf4j 那样在 Java 中具有绝对统治地位.golang ...

weixin_30220993的博客 2411

基于Simulink的光伏电站AGC/AVC协调控制仿真

摘要:本文基于Simulink构建光伏电站AGC/AVC协调控制仿真模型,通过分层控制架构实现有功-无功解耦与储能协同。系统包含100kW光伏阵列、50kWh储能及逆变器组件,采用PID控制器实现AGC频率调节(±0.1Hz)和Q-V下垂控制实现AVC电压稳定(±2%)。仿真验证了三种工况下协调控制的有效性:正常调度时储能充电20kW;负荷突增时储能15kW放电维持频率;光照骤降时储能30kW放电并吸收2kVAR无功稳定电压。结果表明,该方案可使频率/电压偏差分别控制在0.1Hz和7.6V内,响应时间&lt

xiaoheshang_123的博客 235

超声波法检测局部放电的原理与实现

摘要:超声波法通过捕捉局部放电产生的声波信号进行检测,系统由超声波传感器、信号调理单元和数据采集系统组成。其核心应用是局放源定位,主要采用时差定位法和声-电联合定位法。该方法具有抗电磁干扰强、定位精确等优点,但也存在信号衰减大、传播路径复杂等缺点,典型应用于变压器、GIS等设备的在线监测与故障诊断。

start_up_go的博客 374

Go使用gomail发送邮件详解,及使用smtp、email发送邮件

package main import ( "crypto/tls" "fmt" "gopkg.in/gomail.v2" ) func main() { test1() } func test1() { message := ` <p> Hello %s,</p> <p style="text-indent:2em">test test test test test test test test test test test test.

Lawson的博客 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【亲测免费】 Go邮件库Gomail使用教程

**Gomail** 是一个用于Go语言的简单高效的邮件发送库。它具有良好的测试覆盖率和详细文档,使得在Go中发送电子邮件变得非常简便。该库仅依赖于Go标准库,遵循最佳实践并提供了一些默认设置。 ### 主要特性 - 简洁易用的API接口 - 支持多种邮件类型(如纯文本、HTML、附件等) - 安全的SMTP连接(包括STARTTLS和SSL/TLS) - 多地址处理(如收件人、抄送人、密送人)...

gitblog_00981的博客 7625

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Golang使用gomail发送邮件

【代码】Golang使用gomail发送邮件。

weixin_45941687的博客 3764

Go每日一库之Flag

上面我们介绍了使用定义选项,这种方式需要我们先定义变量,然后变量的地址。还有一种方式,调用flag.Type(其中Type可以为等)会自动为我们分配变量,返回该变量的地址。除了使用时需要解引用,其它与前一种方式基本相同。flag库并没有显示支持短选项,但是可以通过给某个相同的变量设置不同的选项来实现。即两个选项共享同一个变量。由于初始化顺序不确定,必须保证它们拥有相同的默认值。否则不传该选项时,行为是不确定的。除了使用flag库提供的选项类型,我们还可以自定义选项类型。= nil {

二进制杯莫停的博客 833

antd-mobile PullToRefresh 下拉刷新组件完全指南:状态机、配置项与源码级原理解析

下拉刷新是移动端列表页最常用的交互之一:用户通过手指在页面顶部向下拖动,触发数据更新。ant-design-mobile(antd-mobile)提供的 `PullToRefresh` 组件,以"状态机驱动 + 手势监听"的方式封装了这一能力。本文以 [pull-to-refresh/index.zh.md](https://link.gitcode.com/i/27f4de99fcd33c130

gitblog_00027的博客 526

Go每日一库之8:cast(类型转换)

cast库能在几乎所有常见类型之间转换,使用非常方便。代码量也很小,有时间建议读读源码。完整示例代码在GitHub上。ps: 本以为春节就这么几天,偷个懒,没想到。。。

dz45693的专栏 545

Golang- 邮件服务,发送邮件

Golang- 邮件服务,发送邮件

m0_47195133的博客 1204

go语言发送邮件email,并支持附件并直接在正文中展示图片

【代码】go语言发送email,并支持附件并直接在正文中展示图片。

cnngavij的博客 1419

Go语言邮件神器email库:5分钟快速上手邮件发送

还在为Go语言邮件发送而烦恼吗?😅 传统的net/smtp包配置复杂、功能有限,而email库的出现彻底改变了这一现状!这款强大的Go语言邮件库让邮件发送变得前所未有的简单和灵活。 ## 📧 为什么选择email库? email库是一个专为人类设计的邮件接口,它提供了: - **简单易用的API** - 几行代码就能发送邮件 - **完整的邮件功能** - 支持收件人、抄送、密送、主题等

gitblog_00116的博客 881

连接池的总结

最近项目中用到了spring的连接池,现在记录一下自己认为对线程池的一些理解。 一、原理       由于数据库连接是一种关键的有限的资源,所以对数据库连接的管理会影响到整个项目的性能,对那些需要高性能的项目显得至关重要。 连接池能够很有效的提升性能,而其的原理如下:       系统在启动的时候创建默认数量的数据库连接,然后保存到内存中,而在系统运行过程中不再在使用数据库的时候新建一个...

沉默王二 2806
上一篇: Go 每日一库之 godotenv
下一篇: Go 每日一库之 dig
darjun
博客等级 码龄10年 109粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值