在GO中发送电子邮件,无法设置Return-Path标头

时间:2014-07-25 15:09:05

标签: go

我正在尝试使用smtp包的内置功能从GO发送简单的电子邮件。

我的简单代码如下:

func sendEmail(to string, body []byte) error {
    auth := smtp.PlainAuth(
        "",
        config.SmtpUsername,
        config.SmtpPassword,
        config.SmtpHostname,
    )

    return smtp.SendMail(
        fmt.Sprintf("%s:%d", config.SmtpHostname, config.SmtpPort),
        auth,
        config.SmtpUsername,
        []string{to},
        body,
    ) 
}

它的工作原理是,它始终将Return-Path标头设置为config.SmtpUsername的值,即使我发送包含自定义Return-Path标头的消息,基本上在发送消息之后,似乎不知何故消息的返回路径将替换为smtp用户名。

有关如何避免这种情况的任何想法,并使GO使用我给出的任何返回路径?

L.E 1:如果有任何帮助,可以在http://play.golang.org/p/ATDCgJGKZ3获取代码段 L.E 2:我可以通过swiftmailer从php实现所需的行为,因此我不认为传送服务器正在以任何方式更改标题。

更多代码:

使用swiftmailer的PHP,它设置了正确的返回路径:

Yii::import('common.vendors.SwiftMailer.lib.classes.Swift', true);
Yii::registerAutoloader(array('Swift', 'autoload'));
Yii::import('common.vendors.SwiftMailer.lib.swift_init', true);

$hostname   = '';
$username   = '';
$password   = '';
$returnPath = '';
$subject    = 'Swiftmailer sending, test return path';
$toEmail    = '';

$transport = Swift_SmtpTransport::newInstance($hostname, 25);
$transport->setUsername($username);
$transport->setPassword($password);

$logger  = new Swift_Plugins_LoggerPlugin(new Swift_Plugins_Loggers_ArrayLogger());
$mailer  = Swift_Mailer::newInstance($transport);
$mailer->registerPlugin($logger);

$message = Swift_Message::newInstance();

$message->setReturnPath($returnPath);
$message->setSubject($subject);
$message->setFrom($username);
$message->setTo($toEmail);
$message->setBody('Hello, this is a simple test going on here...');

$sent = $mailer->send($message);

print_r($logger->dump());   

使用自定义mysmtp软件包,我只是在tls配置中设置InsecureSkipVerify: true以避免证书错误,但返回路径仍然是错误的:

hostname := ""
username := ""
password := ""
returnPath := ""
subject := "GO sending, test return path"
toEmail := ""
body := "Hello, this is a simple test going on here..."

auth := mysmtp.PlainAuth(
    "",
    username,
    password,
    hostname,
)

header := make(map[string]string)
header["Return-Path"] = returnPath
header["From"] = username
header["To"] = toEmail
header["Subject"] = subject

message := ""
for k, v := range header {
    message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + string([]byte(body))

err := mysmtp.SendMail(
    fmt.Sprintf("%s:%d", hostname, 25),
    auth,
    username,
    []string{toEmail},
    []byte(message),
)

log.Fatal(err)

我完全不知道失败的原因和原因,最后一次测试是针对后缀mta进行的,我刚从postfix配置中删除reject_sender_login_mismatch策略以允许此行为。

1 个答案:

答案 0 :(得分:5)

Return-Path派生自客户端在发送消息时指定的“MAIL FROM”命令。

http://golang.org/src/pkg/net/smtp/smtp.go查看smtp包的实现细节,实现一个使用func (c *Client) Mail(from string) error参数的替代地址的SendMail函数应该不会太难。