6
votes

I am using this to send smtp. It works for one receiver but I'd like to have multiple receivers. I have tried the following:

func sendemail(body string) {  
    from := "smtpemail" 
    pass := "pass"
    to := "[email protected],[email protected]"
    ....
}

I have also tried:

to := "\"[email protected]\",\"[email protected]\""

and:

to := []string{"[email protected]","[email protected]"}

None of them work. Sorry it is so simple, I just begin to work with golang.

1
The latest form (using slice) should work. What was the error message returned by smtp.SendMail?putu
line 15: invalid operation: ("From: " + from + string("\nTo: ")) + to (mismatched types string and []string) and for line 17: cannot use to (type []string) as type string in array or slice literalPHA
You can't concat string with []string simply by + operator. Quick solution will be replacing ... + to with strings.Join(to, ","). Don't forget to import strings package.putu

1 Answers

9
votes

From the net/smtp docs:

The msg parameter should be an RFC 822-style email with headers first, a blank line, and then the message body. The lines of msg should be CRLF terminated. The msg headers should usually include fields such as "From", "To", "Subject", and "Cc".

RFC 822 requires To: header value to be a comma separated list. So while the to variable should remain a []string and be passed to smtp.SendMail as its to parameter, the mail header (in the message) should have it as a comma separated list. Try below to see if it works:

func send(body string) {
    // ...
    to := []string{"[email protected]", "[email protected]"}
    toHeader := strings.Join(to, ",")

    msg := "From: " + from + "\n" +
        "To: " + toHeader + "\n" + // use toHeader
        "Subject: Hello there\n\n" +
        body

    err := smtp.SendMail("smtp.gmail.com:587",
        smtp.PlainAuth("", from, pass, "smtp.gmail.com"),
        from, to, []byte(msg))

    // ...
}