QQ泡沫乐园 · 免费提供游戏辅助,破解软件,活动资讯,喜欢记得收藏哦!
综合软件_线报活动_游戏辅助_最新电影_最优质的的辅助分享平台

如何在Go语言发送邮件?(二):email库

网络 2022-12-31 07:00

简介

程序中经常有发送短信的需求。有异常情况了须要通知管理员和负责人,用户下单后可能须要通知订单信息,电商平台、中国移动和移动都有每月帐单,这些都可以通过短信来推送。还有我们平常收到的垃圾邮件大都也是通过这些方法发送的 。那么怎样在 Go 语言发送短信?本文我们介绍一下email库的使用。

快速使用

这个库的使用快不了,为什么呢?

先安装库,这个自不必说:

$ go get github.com/jordan-wright/email

我们须要额外一些工作。我们晓得邮箱使用SMTP/POP3/IMAP等合同从邮件服务器上拉取电邮。邮件并不是直接发送到邮箱的,而是邮箱恳求拉取的。所以,我们须要配置SMTP/POP3/IMAP服务器。从头搭建尚且可行,而且也有现成的开源库,但是比较麻烦。现在通常的邮箱服务商都开放了SMTP/POP3/IMAP服务器。我这儿拿 126 邮箱来举例,使用SMTP服务器。当然,用 QQ 邮箱也可以。

然后就可以编码了:

package main
import (
  "log"
  "net/smtp"
  "github.com/jordan-wright/email"
)
func main() {
  e := email.NewEmail()
  e.From = "dj "
  e.To = []string{"935653229@qq.com"}
  e.Subject = "Awesome web"
  e.Text = []byte("Text Body is, of course, supported!")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal(err)
  }
}

这里为了我的信息安全,我把真实信息都隐藏了。代码中xxx替换成你的邮箱帐号,yyy替换成里面设置的密码。

代码步骤比较简单清晰:

运行程序将会向我的 QQ 邮箱发送一封电邮:

上海青青旅游世界附件住宿_163邮箱中找不到附件内容怎么办_合肥徽州大道附件的宾馆

有的邮箱会把这些电邮置于垃圾箱中,例如 QQ 。如果收件箱找不到,记得到垃圾箱看看。

抄送

平常我们发邮件的时侯可能会抄献给一些人,还有一些人要秘密抄送 ,即 CC(Carbon Copy)和 BCC (Blind Carbon Copy)。email我们也可以设置这两个参数:

package main
import (
  "log"
  "net/smtp"
  "github.com/jordan-wright/email"
)
func main() {
  e := email.NewEmail()
  e.From = "dj "
  e.To = []string{"935653229@qq.com"}
  e.Cc = []string{"test1@126.com", "test2@126.com"}
  e.Bcc = []string{"secret@126.com"}
  e.Subject = "Awesome web"
  e.Text = []byte("Text Body is, of course, supported!")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal(err)
  }
}

还是一样的,抄送的邮箱自己替换test1/test2/secret用自己的。

运行程序将会向我的 QQ 邮件发送一封电邮,同时抄送一封到我另一个 126 邮箱:

HTML 格式

发送纯文本,邮件不太美观。email支持发送 HTML 格式的内容。与发送纯文本类似,直接设置对象的HTML数组:

package main
import (
  "log"
  "net/smtp"
  "github.com/jordan-wright/email"
)
func main() {
  e := email.NewEmail()
  e.From = "dj "
  e.To = []string{"935653229@qq.com"}
  e.Cc = []string{"xxx@126.com"}
  e.Subject = "Go 每日一库"
  e.HTML = []byte(`
  
  `)
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal("failed to send email:", err)
  }

}

发送结果:

注意,126 的 SMTP 服务器检查比较严格,加上 HTML 之后,很容易被辨识为垃圾邮件不让发送,这时 CC 自己就 OK 了。

附件

添加附件也很容易,直接调用AttachFile即可:

package main
import (
  "log"
  "net/smtp"
  "github.com/jordan-wright/email"
)
func main() {
  e := email.NewEmail()
  e.From = "dj "
  e.To = []string{"935653229@qq.com"}
  e.Subject = "Go 每日一库"
  e.Text = []byte("请看附件")
  e.AttachFile("test.txt")
  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.com"))
  if err != nil {
    log.Fatal("failed to send email:", err)
  }
}

收到的短信:

连接池

实际上每次调用Send时就会和 SMTP 服务器构建一次联接,如果发送短信好多很频繁的话可能会有性能问题。email提供了连接池,可以复用网路联接:

合肥徽州大道附件的宾馆_上海青青旅游世界附件住宿_163邮箱中找不到附件内容怎么办

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.126.com:25",
    4,
    smtp.PlainAuth("", "xxx@126.com", "yyy", "smtp.126.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 {

上海青青旅游世界附件住宿_合肥徽州大道附件的宾馆_163邮箱中找不到附件内容怎么办

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 " e.To = []string{"935653229@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,邮件次序不能保证。

总结

本文介绍了怎样使用 Go 程序发送短信,程序代码都早已置于 GitHub 上github.com/darjun/go-daily-lib/tree/master/email。所有代码都通过测试,大家请放心食用~

大家假如发觉好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上递交 issue

参考

email GitHub:github.com/jordan-wright/email

Go 每日一库 GitHub:github.com/darjun/go-daily-lib

我的博客