【问题标题】:golang & postfix - email received header is localhostgolang & postfix - 收到的电子邮件标头是 localhost
【发布时间】:2016-12-07 08:43:28
【问题描述】:

在尝试设置后缀以允许网站发送密码重置电子邮件时,我注意到当使用

从命令行发送电子邮件时
echo "body" | mail -s "subject" test@example.com

电子邮件可以正常到达,不会被标记为垃圾邮件。但是,当从站点服务器发送时,标头设置为从 localhost 接收,因此被标记为垃圾邮件。

Received: from example.com (localhost [127.0.0.1])
by example.com (Postfix) with ESMTPS id CE1299C435
for <my_email@gmail.com>; Tue,  2 Aug 2016 05:28:41 +0000 (UTC)

请注意,dkim、spf 和 dmarc 测试所有列表为通过,因此它们不是问题。

我还尝试使用上述回显方法发送具有相同内容的电子邮件,并且它可以正常到达(尽管我在上面使用纯文本并且没有添加内容类型标题)。

最初是使用 smtp.SendMail 发送的

err := smtp.SendMail(hostname + ":25", nil, sender, recipients, []byte(msgstr))

它无法设置发送主机,所以为了纠正这个问题,我改用手动拨号,发送 HELO 消息,然后启动 tls(尝试在 HELO 之前启动 tls 导致恐慌说 HELO必须是第一个电话)

c, err := smtp.Dial(host + ":25")
if err != nil {
    log.Panic(err)
}

if err = c.Hello(host); err != nil {
  log.Panic(err)
}

if err = c.StartTLS(config.TLS()); err != nil {
  log.Panic(err)
}

这仍然可以成功发送电子邮件,但与之前收到的标头仍然显示 localhost 作为来源一样,我觉得我误解了一些东西,因为我认为 HELO 用于识别呼叫的来源。

感谢您的建议和帮助,这是我第一次尝试配置 MTA 并像这样使用它,我显然还没有结束一些学习曲线。

【问题讨论】:

  • 我会检查 /etc/hosts 并确保主机名(来自 smtp.SendMail)指向服务器的外部 IP 地址,而不是 127.0.0.1。
  • hostname 等于两个调用的服务器的 fqdn。根据我对所使用语法的理解,hosts 文件是正确的,但我是新手,所以相关行是 127.0.0.1 localhost example.com
  • 我认为这是问题所在。如果 example.com 解析为 127.0.0.1,并且您通过 smtp 向 example.com 发送邮件,则发送 IP 地址的反向查找将是 127.0.0.1 localhost。我会尝试将 example.com 指向 10.77.88.99(替换真实的外部可访问的 IP 地址)。然后,该地址的名字将显示在您的 via-line 中
  • 更改顺序就足够了,将其更改为 127.0.0.1 example.com localhost,导致一切正常,接收到的标头设置正确,但由于某种原因仍显示在垃圾邮件中,不确定为什么,但是我问的问题已经解决了,谢谢Juergen。
  • 我认为现在的问题是 gmail.com 地址使用 example.com 作为邮件中继。通常 smtp 服务器必须是发送电子邮件地址的官方(根据 dns mx 记录)smtp 服务器。你为什么不做你的'回声“身体” | mail -s "subject" test@example.com' 的把戏? golang.org/pkg/os/exec/#example_Cmd_StdoutPipe 除了管道进入 StdinPipe

标签: email go smtp gmail postfix


【解决方案1】:

正如 Juergen Gmeiner 在 cmets 中所建议的,我的问题最终是由配置不当的 /etc/hosts 文件引起的,因此它不会影响其他服务。

现有条目是:

127.0.0.1 localhost example.com

将其更改为:

127.0.0.1 example.com localhost

在不破坏需要 localhost 正确评估的现有服务的同时解决了问题。

此解决方案适用于我的本地托管服务器进程,如果远程服务器出现同样的问题,并且需要使用远程服务器的 ip 和主机名创建等效的类似问题。即

<remote ip> <hostname>

注意:虽然我通过从本地开发版本调用到我们的生产服务器来测试最后一部分并且它工作正常,但它不是一个 100% 测试的解决方案。

感谢大家的帮助,我希望我的这个错误可以帮助以后犯类似错误的其他人。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2016-08-04
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多