Голанг нескольких получателей с gomail.v2

Единственный способ отправки писем через gomail.v2 - использование функции Send() для каждого письма в цикле for. Но мне нужно показать другие адреса электронной почты, на которые было отправлено то же письмо.

for _, recipient := range os.Args[3:] {
    mail.SetAddressHeader("From", "my@mail.com", "My Name")
    mail.SetHeader("To", recipient)
    mail.SetHeader("Subject", os.Args[2])
    mail.SetBody("text/html", os.Args[1])

    if err := dialer.DialAndSend(mail); err != nil {
        log.Printf("Could not send email to %q: %v", recipient, err)
        panic(err)
    }
}

Я нашел что-то вроде:

var emails bytes.Buffer

mail.SetAddressHeader("From", "my@mail.com.br", "My Name")
mail.SetHeader("Subject", os.Args[2])
mail.SetBody("text/html", os.Args[1])

for _, recipient := range os.Args[3:] {
    emails.WriteString(recipient + ",")
}

mail.SetHeader("To", emails.String())

if err := dialer.DialAndSend(mail); err != nil {
    log.Printf("Could not send email to %q: %v", buffer, err)
    panic(err)
}

Он работает, отправляя электронное письмо только первому получателю в строке. А в почтовом менеджере, таком как Gmail, Outlook или любых других, адреса других получателей показываются, но не отправляются.

Как я должен сделать это правильно?

2 ответа

Решение

Дай попробовать?

recipients := os.Args[3:]
addresses := make([]string, len(recipients))
for i, recipient := range recipients {
    addresses[i] = mail.FormatAddress(recipient, "")
}

mail.SetHeader("To", addresses...)

if err := dialer.DialAndSend(mail); err != nil {
    log.Fatal(err)
}

расширение примера выше

      type recipient struct {
    Name    string   `json:"Name"`
    Address string   `json:"Address"`
}

func sendToMultipleRecipientsWithGomailV2(recipients []recipient, subject, message string) {
    mail := gomail.NewMessage()

    addresses := make([]string, len(recipients))
    for i, recipient := range recipients {
        addresses[i] = mail.FormatAddress(recipient.Address, recipient.Name)
    }


    mail.SetHeader("From", "myaddress@gmail.com")
    mail.SetHeader("To", addresses...)
    mail.SetHeader("Subject", subject)
    mail.SetBody("text/html", message)

    dialer := gomail.Dialer{Host: "smtp.gmail.com", Port: 587, Username:"myaddress@gmail.com", Password: "mypassword"}
    if err := dialer.DialAndSend(mail); err != nil {
        log.Fatal(err)
    }
    mail.Reset()
}


func main() {
    recipients := []recipient{{
        Name:    "User 1",
        Address: "user1@gmail.com",
    },{
        Name:    "User 2",
        Address: "user2@yandex.com",
    }}

    sendToMultipleRecipientsWithGomailV2(recipients, "my subject", "my message")
}

https://gist.github.com/kmilodenisglez/ab6518ca77172fdd646501b04bafb479

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