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 ... ") }
Go 实现邮件发送
32 min read