I'm using golang to send email with exim via following method
const sendmail = "/usr/sbin/exim"
func submitMail(m *gomail.Message) (err error) {
cmd := exec.Command(sendmail, "-t")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
pw, err := cmd.StdinPipe()
if err != nil {
return
}
err = cmd.Start()
if err != nil {
return
}
var errs [3]error
_, errs[0] = m.WriteTo(pw)
errs[1] = pw.Close()
errs[2] = cmd.Wait()
for _, err = range errs {
if err != nil {
return
}
}
return
}
The problem is that Exim removes Bcc with -t
If Exim is called with the -t option, to take recipient addresses from a message's headers, it removes any Bcc: header that may exist (after extracting its addresses), unless the message has no To: or Cc: header, in which case a Bcc: header with no addresses is left in the message, in accordance with RFC 822. If -t is not present on the command line, any existing Bcc: header is not removed.
If Exim is called to receive a message with the recipient addresses given on the command line, and there is no Bcc:, To:, or Cc: header in the message, it normally adds a To: header, listing the recipients. Some mailing list software is known to submit messages in this way, and in this case the creation of a To: header is not what is wanted. If the always_bcc option is set, Exim adds an empty Bcc: header instead in this circumstance.
"Sendmail look alike" mode with-t
removes Bcc:
headers after processing them.
In -t
mode Bcc:
headers content will be appended to the (SMTP) recipients list BUT recipients will not see/receive Bcc:
headers.
Style guide suggestion: IF you use another SMTP/MTA soft (e.g. Exim) in "sendmail look alike" (command line comparability mode) THEN use sendmail program/binary provided by them.
const sendmail = "/usr/sbin/sendmail"