我目前正在使用"gopkg.in/gomail.v2"发送电子邮件,其中包含在此处找到的以下代码
package main
import (
"bytes"
"fmt"
"gopkg.in/gomail.v2"
)
func main() {
m := gomail.NewMessage()
m.SetHeader("From", "me@example.com")
m.SetHeader("To", "you@example.com")
m.SetAddressHeader("Bcc", "youbcc@example.com", "Bcc Email")
m.SetHeader("Bcc", "anotherbcc@example.com", "yetbcc@example.com")
m.SetHeader("Reply-To", "me@example.com")
m.SetHeader("Subject", "Subject is to gomail to be discussed")
body := `Why is bcc not getting populated`
m.SetBody("text/html", body)
sendMailViaExim(m)
}
func sendMailViaExim(m *gomail.Message) (err error) {
cmd := exec.Command("/usr/sbin/exim", "-t")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
pw, err := cmd.StdinPipe()
if err != nil {
log.Println(err)
return
}
err = cmd.Start()
if err != nil {
log.Println(err)
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 {
log.Println(err)
return
}
}
return
}
上面的代码不会发送到密件抄送电子邮件;
所以我记录了通过以下代码传递给exim -t
的信息:
buf := new(bytes.缓冲区)
m.WriteTo(buf)//应该用密件抄送写整个味精吗?
FMT.Println(buf.字符串())
控制台记录:
$ go run main.go
Mime-Version: 1.0
Date: Mon, 23 Apr 2018 11:15:54 +0530
To: you@example.com
Reply-To: me@example.com
Subject: Subject is to gomail to be discussed
From: me@example.com
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Why is bcc not getting populated
密件抄送没有达到exim -t
如何在不使用 SMTP 的情况下实现这一目标。
我认为是这个(这是它的更新日志条目)。
尽管如此,上面提交修复的逻辑应该只适用于实际发送邮件 — 即,当包实际使用 SMTP 通信时 服务器(因为,自然,Bcc
不应该转发到第一个处理邮件的 MTA(甚至可能是第一个 MDA - 我懒得阅读 RFC))。
正在讨论的提交是指 相关 RFC 的这一部分实际上提供了三种不同的方法来处理Bcc
标头 领域。 所以我不知道是否应该真正责怪包作者 此更改与否。
然而,即使对于Message.WriteTo
来说,这看起来也像是剥离了Bcc
标题 方法,IMO,这是一个错误。 我认为这是一个错误的原因如下:
- 当包通过SMTP发送邮件时,它用作MTA 或 MDA,并应遵守相关 RFC 为这些定义的规则 邮件代理的类型。
- 当它只是将消息流式传输到 MDA(在您的情况下为 Exim)时, 它作为纯客户端工作,并处理
Bcc
标头字段 显然不是它的事——它应该委托给第一个 "真正的"邮件处理代理。
我能够找到的唯一相关问题/拉取请求是 这,但它看起来像 代码在包含后进行了高度重构,所以我不知道 它是否引入了我认为的错误。
另请参阅此内容。
TL;博士
我会在软件包的错误跟踪器中提交问题。
(如果你愿意这样做,请链接到那里;谢谢。
该问题是由您传递给 exim 的-t
选项引起的。从文档中:
7. 密件抄送:标题行
如果使用-t选项调用 Exim,则从 邮件的标头,它会删除可能存在的任何"密件抄送:">标头行 (提取其地址后)。如果命令中不存在-t行,则不会删除任何现有的密件抄送:。
.