- 前景
- 开发环境
- Go 基础
- 流程控制
- 函数
- 方法
- 面向对象
- 网络编程
- 并发编程
- 数据操作
- 常用标准库
- beego 框架
- gin 框架
- 微服务
- 插件库
- 项目
- 开源仓库
- go 学习线路图
- 音频和音乐
- 身份验证和 OAuth
- 机器人相关
- 标准 CLI
- 构建用户界面库
- 配置
- 持续集成
- CSS 预处理器
- 数据结构
- 数据库
- 数据库驱动
- 日期和时间
- 分布式系统
- 电子邮件
- 嵌入式脚本语言
- 错误处理
- 文件
- 金融
- Forms
- 功能性
- 游戏开发
- 生成与泛型
- 地理位置
- 编译器
- Goroutines
- 图形界面
- 图片
- 物联网
- 工作计划
- JSON格式
- Logging
- 机器学习
- 实现消息传递
- 微软办公软件
- 依赖注入
- 项目布局
- Strings
- 其他
- 自然语言处理
- 网络
- HTTP 客户端
- OpenGL
- ORM
- 包管理
- 性能
- 查询语言
- 资源嵌入
- 科学与数据分析
- 安全
- 序列化
- 服务器应用
- 流处理
- 模板引擎
- 测试
- 文字处理
- 第三方 API
- 实用工具
- UUID
- 验证方式
- 版本控制
- 视频
- Web 框架
- 中间件
- 路由器
- 视窗
- XML 格式
- 代码分析
- 编辑器插件
- 硬件
- go 生成工具
- go 工具
- DevOps 工具
- 其他
发邮件
1.1.1. 介绍
电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过go代码来创建电子邮件,并连接邮件服务器发送邮件。
电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
1.1.2. 特征
- 发件人,收件人,密件抄送和抄送字段
- 文字和HTML邮件正文
- 附件
- 阅读收据
- 自定义标题
1.1.3. 安装
go get github.com/jordan-wright/email
注意:此库的版本需要Go v1.5或更高版本。 如果需要与以前的Go版本兼容,则可以在gopkg.in/jordan-wright/email.v1中使用以前的软件包。
我们需要额外一些工作。我们知道邮箱使用SMTP/POP3/IMAP等协议从邮件服务器上拉取邮件。邮件并不是直接发送到邮箱的,而是邮箱请求拉取的。所以,我们需要配置SMTP/POP3/IMAP服务器。从头搭建固然可行,而且也有现成的开源库,但是比较麻烦。现在一般的邮箱服务商都开放了SMTP/POP3/IMAP服务器。我这里拿 QQ 邮箱来举例。
- 首先我们登录QQ邮箱,设置->账户 找到图片的位置开启
POP3/SMTP/IMAP
并且按照要求生产授权码
1.1.4. 代码
1.实现简单的邮件发送:
package main
import (
"log"
"net/smtp"
"github.com/jordan-wright/email"
)
func main() {
e := email.NewEmail()
//设置发送方的邮箱
e.From = "dj <XXX@qq.com>"
// 设置接收方的邮箱
e.To = []string{"XXX@qq.com"}
//设置主题
e.Subject = "这是主题"
//设置文件发送的内容
e.Text = []byte("www.topgoer.com是个不错的go语言中文文档")
//设置服务器相关的配置
err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "你的邮箱账号", "这块是你的授权码", "smtp.qq.com"))
if err != nil {
log.Fatal(err)
}
}
运行程序就会给你设置的邮箱发送一个邮件,有的邮箱会把邮件当成垃圾邮件发到垃圾箱里面,如果找不到邮件可以去垃圾箱看下。
2.实现抄送功能
该插件有两种抄送模式即 CC(Carbon Copy)和 BCC (Blind Carbon Copy)
抄送功能只需要添加两个参数就好了
e.Cc = []string{"XXX@qq.com",XXX@qq.com}
e.Bcc = []string{"XXX@qq.com"}
全部代码:
package main
import (
"log"
"net/smtp"
"github.com/jordan-wright/email"
)
func main() {
e := email.NewEmail()
//设置发送方的邮箱
e.From = "dj <XXX@qq.com>"
// 设置接收方的邮箱
e.To = []string{"XXX@qq.com"}
//设置抄送如果抄送多人逗号隔开
e.Cc = []string{"XXX@qq.com",XXX@qq.com}
//设置秘密抄送
e.Bcc = []string{"XXX@qq.com"}
//设置主题
e.Subject = "这是主题"
//设置文件发送的内容
e.Text = []byte("www.topgoer.com是个不错的go语言中文文档")
//设置服务器相关的配置
err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "你的邮箱账号", "这块是你的授权码", "smtp.qq.com"))
if err != nil {
log.Fatal(err)
}
}
3.发送html代码的邮件
代码实现:
package main
import (
"log"
"net/smtp"
"github.com/jordan-wright/email"
)
func main() {
e := email.NewEmail()
//设置发送方的邮箱
e.From = "dj <XXX@qq.com>"
// 设置接收方的邮箱
e.To = []string{"XXX@qq.com"}
//设置主题
e.Subject = "这是主题"
//设置文件发送的内容
e.HTML = []byte(`
<h1><a href="http://www.topgoer.com/">go语言中文网站</a></h1>
`)
//设置服务器相关的配置
err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "你的邮箱账号", "这块是你的授权码", "smtp.qq.com"))
if err != nil {
log.Fatal(err)
}
}
4.实现邮件附件的发送
直接调用AttachFile
即可
package main
import (
"log"
"net/smtp"
"github.com/jordan-wright/email"
)
func main() {
e := email.NewEmail()
//设置发送方的邮箱
e.From = "dj <XXX@qq.com>"
// 设置接收方的邮箱
e.To = []string{"XXX@qq.com"}
//设置主题
e.Subject = "这是主题"
//设置文件发送的内容
e.HTML = []byte(`
<h1><a href="http://www.topgoer.com/">go语言中文网站</a></h1>
`)
//这块是设置附件
e.AttachFile("./test.txt")
//设置服务器相关的配置
err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "你的邮箱账号", "这块是你的授权码", "smtp.qq.com"))
if err != nil {
log.Fatal(err)
}
}
5.连接池
实际上每次调用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.qq.com:25",
4,
smtp.PlainAuth("", "XXX@qq.com", "你的授权码", "smtp.qq.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 <XXX@qq.com>"
e.To = []string{"XXX@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。由于使用了 goroutine,邮件顺序不能保证。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论