Go - отправка одновременных писем через тайм-ауты - сброс соединения по пиру

У меня 50 горутин, которые начинаются с канала. Затем процесс навсегда зацикливается на чтении 100 записей базы данных за один раз и в режиме ожидания в течение 10 секунд между вызовами базы данных. Когда он перебирает 100 записей электронной почты для отправки, он передает каждую запись по каналу одной из 50 рабочих групп, которая затем отправляет электронную почту. Проблема в том, что после прохождения примерно 1000 электронных писем я начинаю получать сообщения об ошибках вроде этого:

gomail: не удалось отправить электронное письмо 1: чтение tcp 10.2.30.25:56708->216.###.##.###:25: чтение: сброс соединения по пиру

Я должен отправлять около 50 тысяч писем в день. Что вы порекомендуете? Вот основной код, который обрабатывает очередь электронной почты и передает каждую запись работнику через канал:

func main() {

    MaxWorkers := 50
    println("Creating: " + strconv.Itoa(MaxWorkers) + " workers..")
    batchChannel := make(chan EmailQueue.EmailQueueObj)

    for i := 0; i < MaxWorkers; i++ {
        go startWorker(batchChannel)
    }

    for {
        println("Getting queue..")
        data, _ := EmailQueue.GetQueue() //returns 100 database records

        println("Reading through " + strconv.Itoa(len(data)) + " records..")
        for _, element := range data {
            batchChannel <- element
        }

        time.Sleep(10 * time.Second)
    }
}


func startWorker(channel chan EmailQueue.EmailQueueObj) {
    var s gomail.SendCloser
    var err error
    open := false
    for obj := range channel {
        if !open {
            s, err = dialer.Dial()
            if err != nil {
                fmt.Println(err.Error())
                return
            } else {
                sendEmail(obj, &s)
            }
        } else {
            sendEmail(obj, &s)
        }
        open = true
    }
    s.Close()
}

func sendEmail(obj EmailQueue.EmailQueueObj, s *gomail.SendCloser) {

    m := gomail.NewMessage()
    m.SetHeader("From", "example@example.com")
    m.SetHeader("To", obj.Recipient)
    m.SetHeader("Subject", obj.Subject.String)
    m.SetBody("text/html", obj.HTML.String)

    // Send the email
    response := ""
    status := ""
    if err := gomail.Send(*s, m); err != nil {
        response = err.Error()
        status = "error"
    } else {
        response = "Email sent"
        status = "sent"
    }
    m.Reset()

    return
}

Я использую библиотеку gomail для отправки писем. Я открыт для всего, даже для новой библиотеки или метода для отправки этих писем. Но то, что я делаю в настоящее время, не работает. Любая помощь очень ценится!

0 ответов

Другие вопросы по тегам