Golang邮件发送

摘要:
SMTP是简单邮件传输协议的缩写,即简单邮件传输。首先,我们登录QQ邮箱,设置-˃帐户以查找图像的位置,启用POP3/SMTP/IMAP,并根据需要生成授权代码。1.实现简单的电子邮件发送:packagemainimportfuncmain(){//创建电子邮件e:=email.NewEmail()//设置发件人电子邮件e.From=“xxxx@qq.com“//设置收件人的电子邮件e.To=[]string{”xxxx@qq.com“}//设置主题e.subject=”China“//设置文件发送内容e.Text=[]byte//设置与服务器相关的配置错误:=e.Sender!程序仅在邮件发送或失败后退出,并使用sync.WaitGroup。无法保证goroutine邮件的顺序。

简介:

电子邮件的应用非常广泛,常见在某网站注册一个账号,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等等。这些应用不可能与平时发邮件一样,先打开浏览器,登录邮箱在发送。
如何通过Go语言代码来创建电子邮件,并连接邮件服务器发送邮件?
电子邮件在网络中传输和网页一样需要遵守特定的协议。常见的电子邮件协议包括:SMTP,POP3,LMAP。其中邮件的创建和发送只需要用到SMTP协议,本文只会涉及到SMTP协议。SMTP是Simple Mail Transfer Protocol 简称,即简单邮件传输协议。

安装

go get github.com/jordan-wright/email

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

  • 首先我们登录QQ邮箱,设置->账户 找到图片的位置开启POP3/SMTP/IMAP并且按照要求生产授权码

Golang邮件发送第1张

代码

1、实现简单的邮件发送:
package main

import (
	"log"
	"net/smtp"
	"sync"

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

func main() {
	//创建一个电子邮件
	e := email.NewEmail()
	//设置发送方邮件
	e.From = "xxxx@qq.com"
	//设置接收方得邮件
	e.To = []string{"xxxx@qq.com"}
	//设置主题
	e.Subject = "中国"
	//设置文件发送内容
	e.Text = []byte("北京是个好地方")
	//设置服务器相关的配置
	err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "xxxx@qq.com", "你的授权码", "smtp.qq.com"))
	if err != nil {
		log.Fatal(err)
	}
}

运行程序就会给你设置的邮箱发送一个邮件,有的邮箱会把邮件当成垃圾邮件发到垃圾箱里面,如果找不到邮件可以去垃圾箱看下。

Golang邮件发送第2张

2、实现抄送功能

该插件有两种抄送模式即 CC(Carbon Copy)和 BCC (Blind Carbon Copy);抄送功能只需要添加两个参数就好了

//设置抄送
e.Cc = []string{"xxxx@qq.com"} //如果抄送给多人,逗号隔开
//设置秘密抄送
e.Bcc = []string{"xxxx@qq.com"} //如果抄送给多人,逗号隔开
3.实现发送HTML代码的邮件
e.HTML = []byte(`
<h1><a href="http://www.baidu.com/">百度一下</a></h1>    
`)
4.实现邮件附件发送
e.AttachFile("./test.txt")

连接池

package main

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

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

func main() {
	cp := make(chan *email.Email, 10)
	p, err := email.NewPool(
		"smtp.qq.com:25",
		3,
		smtp.PlainAuth("", "xxxx@qq.com", "你的授权码", "smtp.qq.com"),
	)
	if err != nil {
		log.Fatal("failed to create pool:", err)
	}

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

	for i := 0; i < 10; i++ {
		e := email.NewEmail()
		e.From = "xxxx@qq.com"
		e.To = []string{"xxxx@qq.com"}
		e.Subject = "中国"
		e.Text = []byte(fmt.Sprintf("Awesome Place %d", i+1))
		cp <- e
	}
	close(cp)
	wg.Wait()
}

创建 3 goroutine 共用一个连接池发送邮件,发送 10 封邮件后程序退出。
为了等邮件都发送完成或失败,程序才退出,使用了sync.WaitGroup。由于使用 goroutine 邮件顺序无法保证。

免责声明:文章转载自《Golang邮件发送》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用开源项目免费申请 JetBrains 全家桶 IDEA 开源许可证如何将Excel导入到Mysql数据库中下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Golang的高级数据类型-切片(slice)实战篇

          Golang的高级数据类型-切片(slice)实战篇                              作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。        切片(slice)是Go中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合,切片是围绕动态数组的概念构建的,可以按需自动增长。   ...

自建 Gitlab (邮箱配置、拆分 PostgreSQL、Redis) + 随想

前言 最近折腾了一番自建 gitlab,在此做个记录,供君参考。整个构建过程基于 Docker Swarm(近期有计划将微服务移植到 Kubernetes,但还没倒腾顺手,暂时先沿用旧的方案),主题配图与主题无关,请忽略...... 1. 快速启用 配置的一般原则是先可用再优化,简单启动 gitlab 只需要一条命令: sudo docker run --...

golang的传值调用和传引用调用

传值还是传引用 调用函数时, 传入的参数的 传值 还是 传引用, 几乎是每种编程语言都会关注的问题. 最近在使用 golang 的时候, 由于 传值 和 传引用 的方式没有弄清楚, 导致了 BUG. 经过深入的尝试, 终于弄明白了 golang 的 传值 的 传引用, 尝试过程记录如下, 供大家参考! golang 本质上都是传值方式调用 严格来说, go...

C/C++调用Golang 一

C/C++调用Golang 一 (开发环境: 操作系统: windows 7 32位操作系统 C++: visual studio 2010 Golang:go version go1.9 windows/386 TDM-GCC-32) 用一个简单的例子演示如何在C++中调用golang程序。用golang编写一个简单的函数,编译成动态链接...

Golang学习笔记(一)-Go语言环境安装以及运行代码

Linux安装 Golang官网下载地址:https://golang.org/dl/ 1、下载安装包 2、解压至 /usr/local 目录 tar -C /usr/local -zxvf go1.11.5.linux-amd64.tar.gz 3、添加 /usr/loacl/go/bin 目录到PATH变量中。添加到/ etc/profile 或 $H...

[转]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误-高级

from : https://levy.at/blog/11 进阶篇 关闭HTTP的响应 level: intermediate 当你使用标准http库发起请求时,你得到一个http的响应变量。如果你不读取响应主体,你依旧需要关闭它。注意对于空的响应你也一定要这么做。对于新的Go开发者而言,这个很容易就会忘掉。 一些新的Go开发者确实尝试关闭响应主体,但...