导读

大家好我是平也,今天跟大家介绍一款用来发送邮件的Go语言库email,目前星星1.3k,非常好用。

极速上手

准备工作

初始化项目

go get github.com/jordan-wright/email

本示例项目结构

.
├── go.mod
├── go.sum
└── main.go

开启邮箱SMTP服务,以163邮箱为例,需要先登录到邮箱后台点击开启按钮,在发送完短信之后,会获取到一个授权码,将授权码保存,后面需要用到。

代码示例

首先配置好邮件内容

e := email.NewEmail()
e.From = "平也<pingyeaa@163.com>"
e.To = []string{"602588122@qq.com"}
e.Subject = "发现惊天大秘密!"
e.Text = []byte("平也好帅好有智慧哦~")
  • From:发件人邮箱,格式为“名称+<邮箱>”,也可以直接写邮箱,默认显示的发件人为@符号前的名称
  • To:收件人邮箱地址
  • Subject:邮件标题
  • Text:邮件正文

调用Send方法发送邮件,第一个参数是你的发件人邮箱的SMTP域名+端口号,第二个参数用于身份认证

e.Send("smtp.163.com:25", smtp.PlainAuth("", "pingyeaa@163.com", "<你的密码>", "smtp.163.com"))

smtp.PlainAuth

  • 参数1:通常,identity应该是空字符串,以用作用户名。
  • 参数2:用户名
  • 参数3:密码,如果拿到了授权码,则填写授权码
  • 参数4:服务器地址,163的地址是smtp.163.com,其他平台可自行查看

完整代码如下

package main

import (
"net/smtp" "github.com/jordan-wright/email"
) func main() {
e := email.NewEmail()
//e.From = "pingyeaa@163.com"
e.From = "平也 <pingyeaa@163.com>"
e.To = []string{"xxxxxx@qq.com"}
e.Subject = "发现惊天大秘密!"
e.Text = []byte("平也好帅好有智慧哦~")
err := e.Send("smtp.163.com:25", smtp.PlainAuth("", "pingyeaa@163.com", "KQHQCZSXQWPDZYRF", "smtp.163.com"))
if err != nil {
panic(err)
}
}

拓展

CC与BCC

CC全称是Carbon Copy,意为抄送,BCC全称Blind Carbon Copy,意为暗抄送,收件人看不到被暗抄送给了谁。

e := email.NewEmail()
e.Cc = []string{"xxxxxxx@qq.com"}
e.Bcc = []string{"xxxxxxx@qq.com"}

另一种初始化方式

可以实例化的时候直接赋值

e := &email.Email{
From: "平也 <pingyeaa@163.com>",
To: []string{"xxxxxxx@qq.com"},
Subject: "发现惊天大秘密!",
Text: []byte("平也好帅好有智慧哦~"),
}

发送附件

发送附件非常简单,直接传入文件名即可

e.AttachFile("attachment.txt")

也可以调用Attach自行实现附件发送,AttachFile其实就是对Attach的封装

func (e *Email) AttachFile(filename string) (a *Attachment, err error) {
f, err := os.Open(filename)
if err != nil {
return
}
defer f.Close() ct := mime.TypeByExtension(filepath.Ext(filename))
basename := filepath.Base(filename)
return e.Attach(f, basename, ct)
}

连接池

由于频繁发送邮件会不断的与SMTP服务器建立连接,比较影响性能,所以email提供了连接池的功能

auth := smtp.PlainAuth("", "pingyeaa@163.com", "<你的密码>", "smtp.163.com")
p, _ := email.NewPool("smtp.163.com:25", 4, auth)

创建成功后,就可以借助连接池来发送邮件

e := email.NewEmail()
e.From = "平也 <pingyeaa@163.com>"
e.To = []string{"xxxxxx@qq.com"}
e.Subject = "发现惊天大秘密!"
e.Text = []byte("平也好帅好有智慧哦~") p.Send(e, 10*time.Second)

Go语言库代码示例,欢迎star

https://github.com/pingyeaa/golang-examples

感谢大家的观看,如果觉得文章对你有所帮助,欢迎关注公众号「平也」,聚焦Go语言与技术原理。

Go语言库系列之email的更多相关文章

  1. Go语言库系列之aurora

    背景介绍 今天跟大家推荐一款可以给终端输出上色的工具--aurora. 极速上手 准备工作 初始化项目 go mod init aurora 演示项目结构 . ├── go.mod ├── go.su ...

  2. Go语言库系列之dotsql

    导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql. 背景介绍 dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文 ...

  3. Go语言库系列之flag

    背景 终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗? $ flag girl -h Usage of girl: -height int 身高 (default ...

  4. ElasticSearch 2 (21) - 语言处理系列之单词识别

    ElasticSearch 2 (21) - 语言处理系列之单词识别 摘要 一个英语单词相对容易识别:因为英语单词是被空格或(某些)标点符号隔开的.但在英语中也有反例:you're 这个词是一个单词还 ...

  5. ElasticSearch 2 (20) - 语言处理系列之如何开始

    ElasticSearch 2 (20) - 语言处理系列之如何开始 摘要 Elasticsearch 配备了一组语言分析器,为世界上大多数常见的语言提供良好的现成基础支持. 阿拉伯语.亚美尼亚语,巴 ...

  6. 【Go语言入门系列】Go语言工作目录介绍及命令工具的使用

    [Go语言入门系列]前面的文章: [保姆级教程]手把手教你进行Go语言环境安装及相关VSCode配置 [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞 ...

  7. Linux C C语言库的创建和调用

    C语言库的创建和调用 简介: 假如,你有一个庞大的工程,代码量达到数百兆甚至是数G,你经常会遇到好多重复或常用的地方.每次使用到这些地方时如果都重新写一份基本相同的代码,这当然可以,不过这样会大大地降 ...

  8. R语言数据分析系列六

    R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...

  9. [iOS]C语言知识点系列视频

    C语言知识点系列视频 目录 C语言技术视频-01-变量的定义 C语言技术视频-02-程序分支结构(if...else) C语言技术视频-03-程序分支结构(switch) C语言技术视频-04-程序循 ...

随机推荐

  1. html+css+js+Hbuilder开发一款安卓APP,根本不用学Android开发!

    我们知道,要做一款安卓APP,咱们得先学安卓开发语言,例如java,前端后端.那么没有这些开发语言基础,咱们怎么做呢?其实现在有比较好的开发方案就是做webAPP,咱们可以用web前端知识构建安卓客户 ...

  2. Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)

    A. Even Subset Sum Problem 题意 给出一串数,找到其中的一些数使得他们的和为偶数 题解 水题,找到一个偶数或者两个奇数就好了 代码 #include<iostream& ...

  3. django 从零开始 4 404页面和500页面设置

    在视图函数中定义两个 函数 分别对应404 个500页面 (自定义html内容吧,这里只是展示) 在template页面指向自己定义的404.html和500.html页面 在项目的urls中设置 h ...

  4. vue基础----组件通信($parent,$children)

    1.按照dom的父子级关系,在子组件中可以通过$parent 直接调用父组件的方法,也可得到父组件的属性. 2.在父组件中通过$childrens可以得到一个子组件数组,能够在父组件中调用子组件的方法 ...

  5. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

  6. yarn安装Electron提示安装正常却实际没有安装的解决

    起因 使用Quasar框架开发Electron软件,配置好后发现electron没有正常安装,但是yarn却一本正经的胡说八道:不不不,electron已经在那里了.打开模块安装目录一看还真有elec ...

  7. css hover 动画 transition:background-color 0.2s,color 0.2s; 外层套内层,正常是 里外层 鼠标上来 外层有hover,如果就想到里层hover触发外层hover,要用外层position 定义绝对定位,内层的hover跳出外层的div,这样视觉上就是两个单独的div,进行内外层联动。

    css hover 动画 transition:background-color 0.2s,color 0.2s; 外层套内层,正常是 里外层 鼠标上来 外层有hover,如果就想到里层hover触发 ...

  8. 解决不管其他元素z-index设置多高,都在视频下面的方法

    <div style="z-index:-1"> <embed name="Movie1" src="http://ecards.s ...

  9. 一般人不知道的Flask框架SQLAlchemy的那些事

    目录 SQLAlchemy 1.介绍 2.简单使用(能创建表,删除表,不能修改表) 3.一对多关系 4.多对多关系 5.操作数据表 6.基于scoped_session实现线程安全 7.基本增删查改 ...

  10. Python程序设计试验报告一: 熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告                                                                  班级   物流192   ...