【发布时间】: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