在尝试设置 postfix 以允许网站发送密码重置电子邮件时,我注意到在使用
从命令行发送电子邮件时echo "body" | mail -s "subject" test@example.com
电子邮件到达时很好,没有被标记为垃圾邮件。然而,当从站点服务器发送时, header 被设置为从本地主机接收,因此被标记为垃圾邮件。
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 测试所有列表均已通过,因此它们不是问题所在。
我也尝试过使用上述回显方法发送一封内容相同的电子邮件,并且它顺利到达(尽管我像上面那样使用纯文本并且没有添加内容类型 header )。
最初这是使用 smtp.SendMail 发送的
err := smtp.SendMail(hostname + ":25", nil, sender, recipients, []byte(msgstr))
它没有提供设置发送主机的方法,所以为了纠正这个问题,我改用手动拨号,发送 HELO 消息,然后启动 tls(试图在 HELO 之前启动 tls 导致 panic 说 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)
}
这仍然会成功发送电子邮件,但与之前收到的 header 仍然显示 localhost 作为来源一样,我觉得我误解了一些东西,因为我认为 HELO 用于识别调用的来源。
感谢您的建议和帮助,这是我第一次尝试配置 MTA 并像这样使用它,显然我还没有完成一些学习曲线。
最佳答案
正如 Juergen Gmeiner 在评论中所建议的那样,我的问题最终是由配置不当的 /etc/hosts
文件引起的,因此它不会影响其他服务。
现有条目是:
127.0.0.1 localhost example.com
将其更改为:
127.0.0.1 example.com localhost
在不破坏需要本地主机正确评估的现有服务的情况下解决了问题。
这个解决方案适用于我本地托管的服务器进程,如果远程服务器出现同样的问题,并且需要使用远程的 ip 和主机名创建等价物。即
<remote ip> <hostname>
注意:虽然我通过从我的本地开发构建调用我们的生产服务器来测试这最后一部分并且它有效,但它不是 100% 测试的解决方案。
谢谢大家的帮助,我希望我的这个错误对以后犯类似错误的其他人有所帮助。
关于email - golang & postfix - 收到的电子邮件 header 是本地主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38712902/