550 Bad HELO - 主机冒充主机名

设置 Discourse 后,我遇到了 Bad HELO 错误。

我进行了一些排查,发现如果反向 DNS 与主机名不匹配,在某些情况下可能会出现此问题。

在我的情况下,由于邮件服务器主机名位于共享的 DirectAdmin 服务器上,而我正在一个与主机名域名不同的域名上设置 Discourse,因此出现了该问题。

  DISCOURSE_SMTP_ADDRESS: mail.example.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: discourse@example.com
  DISCOURSE_SMTP_PASSWORD: "my_password_without_hash"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选,默认为 true)
  DISCOURSE_SMTP_DOMAIN: 20.example.org #注意 DirectAdmin 的域名与我的域名不同。
  DISCOURSE_NOTIFICATION_EMAIL: noreply@example.com

很有可能是反向 DNS 条目不匹配导致的问题。例如,你从一个 IP 连接并发送 EHLO domainname.com,接收服务器对该 IP 进行反向查找,发现的是 www.domainname.com,这与前者不完全匹配,因此会报错或拒绝连接。这并不违反 SMTP 规范,但属于常见的反垃圾邮件和反伪造做法。

PHPMailer 默认会从 From 地址派生 SMTP 信封发件人地址,但你可以通过 Hostname 属性(注意这与 Host 不同)来覆盖该设置,例如:

$mail->From = 'user@domainname.com';
$mail->Hostname = 'www.domainname.com';
https://github.com/PHPMailer/PHPMailer/issues/1095

运行

  dig -x your.ip.number

能获取你的主机名吗?

嗨,Jay,

Discourse 目前还不允许我在回复中发布链接。所以我会用“dot”代替句号,希望这样能保持清晰。

是的,当我对运行 Discourse 的 VPS 执行此命令时,我得到的是 Discourse 所在的主机名,例如 discourse dot example dot com。

如果我对共享服务器(即邮件服务器所在的服务器)执行此命令,我得到的是它的主机名,例如 above 20 dot example dot org,而不是 example dot com。从技术上讲,example dot com 解析到共享服务器的 IP 地址,但该共享服务器还有另一个主机名(20 dot example dot org)。