func processMailQueue() { for { select { case msg := <-mailQueue: num, err := buildAndSend(msg) tos := strings.Join(msg.To, "; ") info := "" if err != nil { if len(msg.Info) > 0 { info = ", info: " + msg.Info } log.Error(4, fmt.Sprintf("Async sent email %d succeed, not send emails: %s%s err: %s", num, tos, info, err)) } else { log.Trace(fmt.Sprintf("Async sent email %d succeed, sent emails: %s%s", num, tos, info)) } } } }
func buildAndSend(msg *Message) (int, error) { log.Trace("Sending mails to: %s", strings.Join(msg.To, "; ")) // get message body content := msg.Content() if len(msg.To) == 0 { return 0, fmt.Errorf("empty receive emails") } else if len(msg.Body) == 0 { return 0, fmt.Errorf("empty email body") } if msg.Massive { // send mail to multiple emails one by one num := 0 for _, to := range msg.To { body := []byte("To: " + to + "\r\n" + content) err := sendToSmtpServer([]string{to}, body) if err != nil { return num, err } num++ } return num, nil } else { body := []byte("To: " + strings.Join(msg.To, ";") + "\r\n" + content) // send to multiple emails in one message err := sendToSmtpServer(msg.To, body) if err != nil { return 0, err } else { return 1, nil } } }