内容简介:发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增加新功能。于是乎出现了一些强大的第三方邮件库,今天推荐的这个库就是其中之一。项目地址:email 包的设计易于使用,但又足够灵活以免受到限制。目的是为开发者提供友好的电子邮件接口。
发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增加新功能。于是乎出现了一些强大的第三方邮件库,今天推荐的这个库就是其中之一。
项目地址: https://github.com/jordan-wright/email ,Star 数 1.3k+。
简介
email 包的设计易于使用,但又足够灵活以免受到限制。目的是为开发者提供友好的电子邮件接口。
该包当前支持以下功能:
- From, To, Bcc, 和 Cc;
- 邮件地址同时支持 “ test@example.com ” 和 “First Last test@example.com ” 两种形式;
- 正文支持普通文本和 HTML;
- 附件支持;
- 已读回馈;
- 自定义协议头;
- 。。。
快速使用
先安装:
$ go get github.com/jordan-wright/email
后使用,使用 Gmail 发送邮件:
e := email.NewEmail()
e.From = "Jordan Wright <test@gmail.com>"
e.To = []string{"test@example.com"}
e.Bcc = []string{"test_bcc@example.com"}
e.Cc = []string{"test_cc@example.com"}
e.Subject = "Awesome Subject"
e.Text = []byte("Text Body is, of course, supported!")
e.HTML = []byte("<h1>Fancy HTML is supported, too!</h1>")
e.Send("smtp.gmail.com:587", smtp.PlainAuth("", "test@gmail.com", "password123", "smtp.gmail.com"))
- 通过 NewEmail 获取一个 Email 的实例;
- From 设置发件人;
- To 设置发给谁,支持多人;
- Cc 设置抄送人,支持多人;
- Bcc 设置密抄人,支持多人;
- Subject 指定邮件标题;
- Text 指定普通文本邮件正文;
- HTML 指定 HTML 格式邮件正文;
- 调用 Email 实例的 Send 方法进行邮件发送:第一个参数是 smtp 地址,第二个参数是 smtp.Auth 实例;
可见该库最终还是使用标准库 net/smtp 进行实际的邮件发送。
注意事项
- From 中如果包含中文,比如:
e.From = "Go语言中文网<polaris@studygolang.com>”
收到的邮件不会显示发件人,有人提了一个 PR 支持 non-US-ASCII,但还未被 merge;根据该 PR 的提示,我们可以这样解决此问题:
e.From = mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<polaris@studygolang.com>"
- 如果同时指定 Text 和 HTML,则 Text 的内容会被忽略;
- 虽然默认情况下会尝试切换到 TLS,但如果想显示使用 TLS,则调用 Email#SendWithTLS 方法,具体代码如下:
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: smtpHost,
}
e.SendWithTLS(addr, auth, tlsConfig)
- 因为 Email 结构体的字段都是导出的,因此可以通过
&email.Email{}这种形式创建实例,并直接为各个字段赋值;
带附件的邮件
如果邮件中需要带上附件,这个库很方便:
e.AttachFile("test.txt")
也可以是通过 io.Reader 读取文件:
func (e *Email) Attach(r io.Reader, filename string, c string) (a *Attachment, err error)
其中 filename 是放入附件显示的文件名,c 是 Content-Type,如果为空,则使用 application/octet-stream 。
重用连接
该库还支持连接池,例如:
p, err := email.NewPool(
"smtp.qq.com:25",
4,
smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
- 第 2 个参数 4 表示最多开启 4 个连接
通过 p 的 Send 方法执行发送操作:
p.Send(e, 10e9)
完整例子如下:
package main
import (
"log"
"mime"
"net/smtp"
"net/textproto"
"strconv"
"sync"
"github.com/jordan-wright/email"
)
func main() {
var wg sync.WaitGroup
ch := make(chan *email.Email, 4)
err := sendEmailByPool(ch, &wg)
if err != nil {
panic(err)
}
for i := 0; i < 4; i++ {
wg.Add(1)
ch <- &email.Email{
To: []string{"polaris@studygolang.com"},
From: mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<274768166@qq.com>",
Subject: "Pool" + strconv.Itoa(i),
HTML: []byte("<h1>这是 HTML 正文</h1>"),
Headers: textproto.MIMEHeader{},
}
}
wg.Wait()
close(ch)
}
func sendEmailByPool(ch <-chan *email.Email, wg *sync.WaitGroup) error {
p, err := email.NewPool(
"smtp.qq.com:25",
4,
smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
if err != nil {
return err
}
for i := 0; i < 4; i++ {
go func() {
for e := range ch {
err := p.Send(e, 10e9)
if err != nil {
log.Println("Send Email fail, err:", err)
} else {
log.Println("Send Email Successfully!")
}
wg.Done()
}
}()
}
return nil
}
总结
通过上面的介绍,你应该掌握了该库的使用,该库是不是满足了你对发邮件的需求?
最后附上一个完整的带附件的发邮件程序:
package main
import (
"log"
"mime"
"net/smtp"
"strings"
"github.com/jordan-wright/email"
)
func main() {
sendEmail("测试第三方 email 库", "xuxinhua@studygolang.com")
}
func sendEmail(subject string, tos ...string) error {
e := email.NewEmail()
smtpUsername := "274768166@qq.com"
e.From = mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<274768166@qq.com>"
e.To = tos
e.Subject = subject
e.HTML = []byte("<h1>HTML 正文</h1>")
e.AttachFile("zap.log")
auth := smtp.PlainAuth("", smtpUsername, "password", "smtp.qq.com")
err := e.Send("smtp.qq.com:25", auth)
if err != nil {
log.Println("Send Mail to", strings.Join(tos, ","), "error:", err)
return err
}
log.Println("Send Mail to", strings.Join(tos, ","), "Successfully")
return nil
}
- 你本地测试时注意将发件人、收件人和密码改为你自己的。
欢迎关注我的公众号:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- SpringBoot实现发送电子邮件
- 绕过电子邮件格式过滤进行SQL注入
- javascript – 类型电子邮件不支持selectionrange
- php – 使用TCPDF发送电子邮件附件
- 在电子邮件正文中应用HTML格式
- 防止电子邮件网络钓鱼攻击的10种方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Masterminds of Programming
Federico Biancuzzi、Chromatic / O'Reilly Media / 2009-03-27 / USD 39.99
Description Masterminds of Programming features exclusive interviews with the creators of several historic and highly influential programming languages. Think along with Adin D. Falkoff (APL), Jame......一起来看看 《Masterminds of Programming》 这本书的介绍吧!