通过Exim发送电子邮件(没有smtp)?

时间:2018-04-23 06:12:53

标签: go exim gomail

我目前正在使用“gopkg.in/gomail.v2”发送以下code found here

的电子邮件
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.Buffer)

     

m.WriteTo(buf)//应该用bcc编写整个msg吗?

     

fmt.Println(buf.String())

并且控制台已记录:

$ 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

bcc没有进入exim -t如何在不使用smtp的情况下实现这一目标。

2 个答案:

答案 0 :(得分:1)

我认为它是this(而here是它的更改日志条目。)

但是,上面提交修复的逻辑应该只适用于实际 发送消息 - 也就是说,当包实际上与SMTP通话时 服务器(因为,Bcc当然不应该通过处理消息的第一个MTA转发(甚至可能是第一个MDA-I懒惰地阅读RFC)。

正在讨论的提交是指 this part of a relevant RFC实际上提供了三种处理Bcc标头的方法 领域。 所以我不知道是否真的责怪包裹作者 这种变化与否。

然而,即使Bccthis看起来像是剥离Message.WriteTo标题 方法,IMO,这是一个错误。 我认为这是一个错误的原因如下:

  • 当程序包通过SMTP发送邮件时,它可以作为MTA使用 或者MDA,并且应该遵守相关RFC为这些规则定义的规则 邮件代理的类型。
  • 当它仅将消息流式传输到MDA(在您的情况下为Exim)时, 它作为纯客户端,以及Bcc标头字段的处理 显然不是它的业务 - 它应该被委托给第一个 "实"邮件处理代理。

我能找到的唯一相关问题/拉动请求是 this但它看起来像 代码在包含后被高度重构,所以我不知道 它是否引入了我认为的错误。

另见this

<强> TL; DR

我会在软件包的bug跟踪器中提出问题。

(如果你愿意的话,请把它链接到那里;谢谢。)

答案 1 :(得分:-2)

问题是由传递给exim的-t选项引起的。来自the docs

  

7。密件抄送:标题行

     

如果使用 -t 选项调用了Exim,则会从以下地址获取收件人地址   邮件的标题,它将删除可能存在的所有 Bcc:标题行   (提取其地址后)。如果命令上没有 -t   行,则不会删除任何现有的 Bcc: