英文:
SendGrid SMTP emails are not delivered to CC and BCC addresses in Go
问题
我正在尝试发送带有抄送(CC)和密送(BCC)的电子邮件。但是CC和BCC地址的邮件未能送达。但是CC地址会显示给收件人。下面是一个快照。
我正在使用golang的net/smtp和SendGrid来发送邮件。下面是我的代码示例:
func SendEmail() error {
email := entity.Email{
From: "info@somewhere.cloud",
To: []string{"crajuceveifre-5717@yopmail.com"},
ReplyTo: "dileulobugre-7335@yopmail.com",
Subject: "Email Subject",
Body: "Email Body",
BCC: []string{"lecrecezufeu-9078@yopmail.com"},
CC: []string{"houcroissezitri-3721@yopmail.com"},
}
emailMessageBytes := ToBytes(email)
smtpAuth := smtp.PlainAuth("", "apikey", config.Config.EmailClientApiKey, config.Config.EmailClientHost)
err := smtp.SendMail(config.Config.EmailClientHost+":"+config.Config.EmailClientPort, smtpAuth, email.From, email.To, emailMessageBytes)
if err != nil {
log.Printf("smtp error: %s", err)
return err
}
return nil
}
func ToBytes(m entity.Email) []byte {
buf := bytes.NewBuffer(nil)
buf.WriteString(fmt.Sprintf("From: %s\r\n", m.From))
buf.WriteString(fmt.Sprintf("To: %s\r\n", strings.Join(m.To, ",")))
buf.WriteString(fmt.Sprintf("Reply-To: %s\r\n", m.ReplyTo))
if len(m.CC) > 0 {
buf.WriteString(fmt.Sprintf("Cc: %s\r\n", strings.Join(m.CC, ",")))
}
if len(m.BCC) > 0 {
buf.WriteString(fmt.Sprintf("Bcc: %s\r\n", strings.Join(m.BCC, ",")))
}
buf.WriteString(fmt.Sprintf("Subject: %s\r\n", m.Subject))
buf.WriteString("MIME-Version: 1.0\n")
writer := multipart.NewWriter(buf)
boundary := writer.Boundary()
buf.WriteString(fmt.Sprintf("Content-Type: multipart/mixed; boundary=%s\n\n", boundary))
buf.WriteString(fmt.Sprintf("--%s\n", boundary))
buf.WriteString("Content-Type: text/html; charset=utf-8\n")
buf.WriteString(m.Body)
buf.WriteString(fmt.Sprintf("\n\n--%s\n", boundary))
return buf.Bytes()
}
请帮助我。提前谢谢
英文:
I am trying to send an email with CC & BCC. Emails are not delivered to CC & BCC addresses. But CC addresses are displayed to the recipient's details. A snapshot is given below.
I am using golang net/smtp with SendGrid. My code sample is given below.
func SendEmail() error {
email := entity.Email{
From: "info@somewhere.cloud",
To: []string{"crajuceveifre-5717@yopmail.com"},
ReplyTo: "dileulobugre-7335@yopmail.com",
Subject: "Email Subject",
Body: "Email Body",
BCC: []string{"lecrecezufeu-9078@yopmail.com"},
CC: []string{"houcroissezitri-3721@yopmail.com"},
}
emailMessageBytes := ToBytes(email)
smtpAuth := smtp.PlainAuth("", "apikey", config.Config.EmailClientApiKey, config.Config.EmailClientHost)
err := smtp.SendMail(config.Config.EmailClientHost+":"+config.Config.EmailClientPort, smtpAuth, email.From, email.To, emailMessageBytes)
if err != nil {
log.Printf("smtp error: %s", err)
return err
}
return nil
}
func ToBytes(m entity.Email) []byte {
buf := bytes.NewBuffer(nil)
buf.WriteString(fmt.Sprintf("From: %s\r\n", m.From))
buf.WriteString(fmt.Sprintf("To: %s\r\n", strings.Join(m.To, ",")))
buf.WriteString(fmt.Sprintf("Reply-To: %s\r\n", m.ReplyTo))
if len(m.CC) > 0 {
buf.WriteString(fmt.Sprintf("Cc: %s\r\n", strings.Join(m.CC, ",")))
}
if len(m.BCC) > 0 {
buf.WriteString(fmt.Sprintf("Bcc: %s\r\n", strings.Join(m.BCC, ",")))
}
buf.WriteString(fmt.Sprintf("Subject: %s\r\n", m.Subject))
buf.WriteString("MIME-Version: 1.0\n")
writer := multipart.NewWriter(buf)
boundary := writer.Boundary()
buf.WriteString(fmt.Sprintf("Content-Type: multipart/mixed; boundary=%s\n\n", boundary))
buf.WriteString(fmt.Sprintf("--%s\n", boundary))
buf.WriteString("Content-Type: text/html; charset=utf-8\n")
buf.WriteString(m.Body)
buf.WriteString(fmt.Sprintf("\n\n--%s\n", boundary))
return buf.Bytes()
}
Please help me. Advance thanks
答案1
得分: 2
在底层,smtp.SendMail为每个to
收件人调用smtp.Client.Rcpt
。
to
切片指定了实际接收电子邮件的人。电子邮件正文中的收件人仅用于信息提供 - 实际上,它们甚至不需要与真实的收件人信息匹配。
因此,要解决您的寻址问题,您需要收集所有的to
、cc
和bcc
收件人:
var all []string
for _, a := range [][]string{email.To, email.CC, email.BCC} {
all = append(all, a...)
}
err := smtp.SendMail(
config.Config.EmailClientHost+":"+config.Config.EmailClientPort,
smtpAuth,
email.From,
all, //email.To,
emailMessageBytes,
)
另外,由于每个收件人都会收到电子邮件的正文,出于明显的隐私原因,bcc
用户不应在正文中列出。
因此,请删除以下内容:
// if len(m.BCC) > 0 {
// buf.WriteString(fmt.Sprintf("Bcc: %s\r\n", strings.Join(m.BCC, ",")))
//}
英文:
Under the covers, smtp.SendMail calls smtp.Client.Rcpt
for each to
recipient.
The to
slice directs who will actually receive the email. The addressees in the body of the email is purely informational - in fact they don't even need to match the real addressee info.
So to fix your addressing issue, you need to collect all to
, cc
& bcc
addressees:
var all []string
for _, a := range [][]string{email.To, email.CC, email.BCC} {
all = append(all, a)
}
err := smtp.SendMail(
config.Config.EmailClientHost+":"+config.Config.EmailClientPort,
smtpAuth,
email.From,
all, //email.To,
emailMessageBytes,
)
also since every recipient receives the body of the e-mail, bcc
users should not be listed in the
body, for obvious privacy reasons.
So remove this:
// if len(m.BCC) > 0 {
// buf.WriteString(fmt.Sprintf("Bcc: %s\r\n", strings.Join(m.BCC, ",")))
//}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论