mailsender.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/smtp"
  6. "time"
  7. )
  8. type MailRequest struct {
  9. sendto []string
  10. title string
  11. content string
  12. }
  13. type MailSender struct {
  14. queue chan *MailRequest
  15. }
  16. func NewMailSender() *MailSender {
  17. return &MailSender{
  18. queue: make(chan *MailRequest, 100),
  19. }
  20. }
  21. func (s *MailSender) Loop() {
  22. timer := time.NewTimer(time.Second * 3)
  23. timeouted := false
  24. for {
  25. list := make([]*MailRequest, 0)
  26. //一次取10条记录
  27. for i := 0; i < 10; i++ {
  28. timer.Reset()
  29. select {
  30. case req, ok = <-s.queue:
  31. timer.Stop()
  32. if ok {
  33. list = append(list, req)
  34. }
  35. case <-timer.C:
  36. timeouted = true
  37. }
  38. //如果不足10条也返回
  39. if timeouted {
  40. break
  41. }
  42. }
  43. //发送邮件
  44. if len(list) > 0 {
  45. //取SMTP配置
  46. cfg := SysSetting.GetMulti([]string{"smtp_host", "smtp_port", "smtp_user", "smtp_pwd", "smtp_sender"})
  47. auth := smtp.PlainAuth("", cfg["smtp_user"], cfg["smtp_pwd"], cfg["smtp_host"])
  48. address := fmt.Sprintf("%s:%d", cfg["smtp_port"], cfg["smtp_port"])
  49. //循环发送
  50. for _, req := range list {
  51. err := smtp.SendMail(address, auth, cfg["smtp_sender"], req.sendto, []byte(req.content))
  52. if err != nil {
  53. log.Printf("SMTP send mail failed: %s\n", err.Error())
  54. }
  55. }
  56. }
  57. }
  58. }
  59. func (s *MailSender) Push(req *MailRequest) {
  60. timer := time.NewTimer(time.Second * 3)
  61. select {
  62. case s.queue <- req:
  63. timer.Stop()
  64. case <-timer.C:
  65. }
  66. }