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

 1、使用gopkg.in/gomail.v2发送邮件

1.1 先安装gomail包

go get -v gopkg.in/gomail.v2

实现代码如下:

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.</p> 
		<p style="text-indent:2em">test test test test test test test test test test test test.</p>

		<p style="text-indent:2em">test test test test test test test test test test test test.</P>

		<p style="text-indent:2em">Best Wishes!</p>
	`

	// QQ 邮箱:
	// SMTP 服务器地址:smtp.qq.com(SSL协议端口:465/994 | 非SSL协议端口:25)
	// 163 邮箱:
	// SMTP 服务器地址:smtp.163.com(端口:25)
	host := "smtp.qq.com"
	port := 25
	userName := "******@qq.com"
	password := "**********"

	m := gomail.NewMessage()
	m.SetHeader("From", userName) // 发件人
	// m.SetHeader("From", "alias"+"<"+userName+">") // 增加发件人别名

	m.SetHeader("To", "******@qq.com", "******@qq.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
	m.SetHeader("Cc", "******@qq.com")                  // 抄送,可以多个
	m.SetHeader("Bcc", "******@qq.com")                 // 暗送,可以多个
	m.SetHeader("Subject", "Hello!")                    // 邮件主题

	// text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
	// 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等
	m.SetBody("text/html", fmt.Sprintf(message, "testUser"))

	// text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理
	// m.SetBody("text/plain", "纯文本")
	// m.Attach("test.sh")   // 附件文件,可以是文件,照片,视频等等
	// m.Attach("lolcatVideo.mp4") // 视频
	// m.Attach("lolcat.jpg") // 照片

	d := gomail.NewDialer(
		host,
		port,
		userName,
		password,
	)
	// 关闭SSL协议认证
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

	if err := d.DialAndSend(m); err != nil {
		panic(err)
	}
}

1.2、创建一个Message实例,Message提供了整个邮件协议内容的构建,默认实例采用UTF-8字符集和Quoted-printable编码。

	m := gomail.NewMessage()

1.3、设置发件人

	m.SetHeader("From", userName) // 发件人
	// m.SetHeader("From", "test"+"<"+userName+">") // 增加发件人别名

如果你觉得发件人只是一个邮箱名称,让你不好识别发件人是谁,这时可以通过注释行来设置发件人的别名,"test"即是发件人的别名名称。

1.4、设置收件人、抄送、暗送

// 收件人,可以多个收件人
	mailTo := []string{
		"******@qq.com",
		"******@qq.com",
	}
	m.SetHeader("To", mailTo...)

	// m.SetHeader("To", "******@qq.com", "******@qq.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
	m.SetHeader("Cc", "******@qq.com")                  // 抄送,可以多个
	m.SetHeader("Bcc", "******@qq.com")                 // 暗送,可以多个

可以通过数组设置多个收件人、抄送和暗送,或者和注释行一样使用逗号分开

1.5、设置邮件内容

	// text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
	// 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等
	m.SetBody("text/html", fmt.Sprintf(message, "testUser"))

	// text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理
	// m.SetBody("text/plain", "纯文本")

"text/plain"文本格式:text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理;

"text/html"文本格式:text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。可以通过 text/html 对文本格式进行特殊处理,如换行、缩进、加粗等等

1.6、设置附件

	m.Attach("test.sh") // 附件文件,可以是文件,照片,视频等等
	// m.Attach("lolcatVideo.mp4") // 视频
	// m.Attach("lolcat.jpg") // 照片

附件可以为文件、视频、照片等等

1.6.1、通过gomail.Rename()方法设置附件的别名

m.Attach(url, gomail.Rename(path.Base(file_name)))

1.6.2、在起别名的时候,如果别名中存在中文时可能会出现乱码:

m.Attach(url, gomail.Rename(mime.QEncoding.Encode("UTF-8", path.Base(file_name))))

通过mime.QEncoding.Encode()设置格式为UTF-8,防止乱码。

1.6.3、将邮件内容格式更改为Base64编码

    m := gomail.NewMessage(
        gomail.SetEncoding(gomail.Base64),
    )

1.7、创建SMTP客户端,连接到远程的邮件服务器

    host := "smtp.qq.com"
	port := 25
	userName := "******@qq.com"
	password := "**********" // qq邮箱填授权码
	d := gomail.NewDialer(
		host,
		port,
		userName,
		password,
	)

1.7.1、QQ授权码获取方式:

出于邮箱安全的考虑,很多邮箱缺省是关闭 POP3/SMTP 服务的,需要登录邮箱设置后开启。

以 QQ 邮箱为例,进入邮箱“设置”,在“帐户”项里就可找到“POP3/SMTP服务”的设置项,进行开启。

这里写图片描述

温馨提示:登录第三方客户端时,密码框请输入“授权码”进行验证。

也就是说,在使用 QQ 邮箱发送邮件的时候,需要使用授权码,而不是 QQ 密码!

1.7.2、常用邮箱信息

邮箱类型SMTP 服务器地址SSL协议端口非SSL协议端口
QQ 邮箱smtp.qq.com465/58725
163 邮箱smtp.163.com465/99425
office365 邮箱smtp.office365.com465/58725

1.8、关闭TLS认证:

d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

设置为true时,关闭TLS认证,否则默认开启,需要配置证书认证,稍微麻烦一些。

1.9、测试效果如下:

2、使用 github.com/jordan-wright/email 和 "net/smtp" 发送邮件,用QQ邮件为发件人为例:

func emailTest() {
	host := "smtp.qq.com"
	port := "25"
	userName := "*****@qq.com"
	password := "******" // qq邮箱填授权码

	e := &email.Email{
		To:      []string{"******@qq.com", "******1@qq.com"},
		From:    userName,
		Subject: "Email Send Test",
		Text:    []byte("Text Body is, of course, supported!"),
		HTML:    []byte("<h1>This a test email</h1>"),
		Headers: textproto.MIMEHeader{},
	}

	err := e.Send(host+port, smtp.PlainAuth("", userName, password, host))
	if err != nil {
		panic(err)
	}
}

2.1、测试效果如下:

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值