Go 实现邮件发送

32 min read
func main() {

   // 简单设置l og 参数
   log.SetFlags(log.Lshortfile | log.LstdFlags)

   // 创建有5 个缓冲的通道,数据类型是  *email.Email
   ch := make(chan *email.Email, 5)
   // 连接池
   p, err := email.NewPool(
      "smtp.qq.com:25",
      3,    // 数量设置成 3 个
      smtp.PlainAuth("", "自己的邮箱", "自己邮箱的授权码", "smtp.qq.com"),
   )

   if err != nil {
      log.Fatal("email.NewPool error : ", err)
   }

   // sync 包,控制同步
   var wg sync.WaitGroup
   wg.Add(3)
   for i := 0; i < 3; i++ {
      go func() {
         defer wg.Done()
          // 若 ch 无数据,则阻塞, 若 ch 关闭,则退出循环
         for e := range ch {
            // 超时时间 10 秒
            err := p.Send(e, 10*time.Second)
            if err != nil {
               log.Printf( "p.Send error : %v , e = %v , i = %d\\n", err , e, i)
            }
         }
      }()
   }

   for i := 0; i < 5; i++ {
      e := email.NewEmail()
      // 设置发送邮件的基本信息
      e.From = "xx <[email protected]>"
      e.To = []string{"[email protected]"}
      e.Subject = "test email.NewPool " + fmt.Sprintf("  the %d email",i)
      e.Text = []byte(fmt.Sprintf("test email.NewPool , the %d email !", i))
      ch <- e
   }

   // 关闭通道
   close(ch)
   // 等待子协程退出
   wg.Wait()
   log.Println("send successfully ... ")
}