Отправлять письма в exim (без smtp)?

В настоящее время я использую "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.Buffer)

m.WriteTo (buf) // должен писать все сообщения с помощью bcc?

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

ОЦК не попадает в exim -t Как мне добиться этого без использования SMTP.

1 ответ

Я думаю, что это таквот запись в журнале изменений для него).

Тем не менее, логика, зафиксированная вышеупомянутой фиксацией, должна применяться только к фактическойотправке сообщений, то есть когда пакет фактически общается с SMTP-сервером (потому что, естественно, Bcc не следует пересылать после первого MTA, обрабатывающего сообщение (может быть, даже первого MDA - мне лень читать RFC)).

Обсуждаемый коммит относится к этой части соответствующего RFC, которая фактически предлагает три различных способа обработки Bcc поля заголовка. Поэтому я понятия не имею, стоит ли винить автора пакета за это изменение или нет.

Тем не менее, это похоже на зачистку Bcc Заголовок прочь даже для Message.WriteToметод, который, IMO, является ошибкой. Причина, по которой я считаю это ошибкой, заключается в следующем:

  • Когда пакет отправляет сообщение через SMTP, он работает как MTA или MDA и должен подчиняться правилам, определенным соответствующими RFC для этих типов почтовых агентов.
  • Когда он просто передает сообщение в MDA (Exim в вашем случае), он работает как чистый клиент и обрабатывает Bcc Поля заголовка явно не являются его делом, скорее, их следует делегировать первому "настоящему" агенту обработки почты.

Единственная уместная проблема / запрос на удаление, которую мне удалось найти, заключается в следующем: похоже, что после включения кода код подвергся сильному рефакторингу, поэтому я понятия не имею, представило ли это то, что я предположил, является ошибкой или нет.

Смотрите также это.

TL; DR

Я бы подал проблему в трекер ошибок пакета.

(Если вы сделаете это, пожалуйста, свяжите это там; спасибо.)

Проблема вызвана -tвариант вы передаете в exim. Из документов:

7. Строка заголовка Bcc:

Если exim вызывается с опцией -t, чтобы взять адреса получателей из заголовка сообщения, он удаляет любую строку заголовка Bcc:, которая может существовать (после извлечения ее адресов). Если -t отсутствует в командной строке, существующие скрытые копии: не удаляются.

.

Другие вопросы по тегам