设置 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