123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package main
- import (
- "fmt"
- "log"
- "net/smtp"
- "time"
- )
- type MailRequest struct {
- sendto []string
- title string
- content string
- }
- type MailSender struct {
- queue chan *MailRequest
- }
- func NewMailSender() *MailSender {
- return &MailSender{
- queue: make(chan *MailRequest, 100),
- }
- }
- func (s *MailSender) Loop() {
- timer := time.NewTimer(time.Second * 3)
- timeouted := false
- for {
- list := make([]*MailRequest, 0)
- //一次取10条记录
- for i := 0; i < 10; i++ {
- timer.Reset()
- select {
- case req, ok = <-s.queue:
- timer.Stop()
- if ok {
- list = append(list, req)
- }
- case <-timer.C:
- timeouted = true
- }
- //如果不足10条也返回
- if timeouted {
- break
- }
- }
- //发送邮件
- if len(list) > 0 {
- //取SMTP配置
- cfg := SysSetting.GetMulti([]string{"smtp_host", "smtp_port", "smtp_user", "smtp_pwd", "smtp_sender"})
- auth := smtp.PlainAuth("", cfg["smtp_user"], cfg["smtp_pwd"], cfg["smtp_host"])
- address := fmt.Sprintf("%s:%d", cfg["smtp_port"], cfg["smtp_port"])
- //循环发送
- for _, req := range list {
- err := smtp.SendMail(address, auth, cfg["smtp_sender"], req.sendto, []byte(req.content))
- if err != nil {
- log.Printf("SMTP send mail failed: %s\n", err.Error())
- }
- }
- }
- }
- }
- func (s *MailSender) Push(req *MailRequest) {
- timer := time.NewTimer(time.Second * 3)
- select {
- case s.queue <- req:
- timer.Stop()
- case <-timer.C:
- }
- }
|