我在 Windows 服务器上运行一个软件,该软件通过远程 SMTP 服务器发送电子邮件通知。它的配置选项很少,并且仅支持基本 SMTP 身份验证,不支持 SSL/TLS。我在 Debian 服务器上运行了 exim4,该服务器将成为此 Windows 程序的 SMTP 服务器。它使用默认配置进行设置,并允许 AUTH PLAIN 和 AUTH LOGIN 未加密连接。我已成功通过 telnet 发送了一封电子邮件:
telnet servername 25
ehlo test
250-AUTH PLAIN LOGIN
...
auth plain XXX
235 Authentication succeeded
mail from: ...
...
但是,我想要连接到此服务器的程序却无法连接。为了查明原因,我在连接期间运行了数据包嗅探器,并看到了以下会话:
C: HELO hostname
S: 250 Hello hostname
C: AUTH LOGIN XXX | XXX
S: 503 AUTH command used when not advertised | 500 unrecognized command
C: QUIT
S: 221 closing connection
我对 SMTP 协议不够熟悉,无法理解这里发生了什么。我需要在 exim4 SMTP 服务器上进行哪些更改才能建立此连接?
答案1
本质503 AUTH command used when not advertised
上可以解释为,它没有为客户端提供使用该AUTH
命令的选项。这很可能是因为客户端使用了HELO
而不是EHLO
(我想指出,您在进行 telnet 测试时使用了 )。
SMTP 身份验证是扩展 SMTP 的一部分,它通过命令启动EHLO
;“普通旧式” SMTP 不支持身份验证,因此从技术上讲它是一个非法命令,即使某些 SMTP 服务器可能仍然允许它。
最好的解决方案是告诉您的程序尽可能使用扩展 SMTP(EHLO
),否则可能会有一个 exim 命令强制它允许在HELO
类型连接上进行 AUTH。
** 更新 **
根据此处的帖子:http://www.exim.org/lurker/message/20040901.063858.126f66ac.en.html
客户端必须在 AUTH 之前提供 EHLO(而不是 HELO)。
也就是说,除非经过通告(通过 EHLO、根据 auth_advertise 等),否则无法使用 AUTH 命令。此行为在 Exim 4.20 中得到了强化,不再是一个选项。
如果你的应用程序无法执行 ,那么你需要一个不同的 MTA EHLO
。或者,你要求身份验证,您可以使用基于 IP 的 ACL 完成同样的事情吗?
最终解决方案
Exim 确实有一个解决这个问题的方法,allow_auth_unadvertised
如下所述这里,你可以这样做:
hosts = *
control = allow_auth_unadvertised
答案2
我遇到过类似的问题。当服务器运行 Exim 时,即使使用 EHLO 也会出现此消息。
在 WHM > 主页 > 服务配置 > Exim 配置管理器中,选项“要求客户端使用 SSL 连接或发出 STARTTLS 命令,然后才允许其与服务器进行身份验证“设置为默认值(开启)。我不确定我是否这样做了,这通常是一个安全的好主意,但会强制邮件服务器仅启用(通告)STARTTLS 命令,而不是 AUTH。因此,当我的脚本发送 AUTH 时,服务器发送的错误消息是正确的。更多信息请访问http://blog.networkpresence.co/?p=8923。有一天,当我有时间时,我会找出如何更改我的脚本以使用 TLS,这样我就可以打开 Exim 选项以确保安全。
添加于 2019 年 11 月 19 日:
我已经找到如何将我的本地“发送电子邮件”脚本更改为使用 TLS,并且我已将我的服务器改回需要 TLS 或 STARTTLS。
我为什么要这么做?
因为我使用的几个网站在发送电子邮件通知时都需要安全的邮件服务器。我花了好长时间才弄清楚为什么他们一直抱怨我的电子邮件地址:那是因为我的邮件服务器接受了不安全的连接!
进一步思考后,我意识到所有 Web 操作都应该是安全的(这是 Let's Encrypt 项目背后的基本思想,该项目是第一个提供可自动更新的免费安全证书的项目)。
需要对使用 fsockopen 函数的 PHP“发送电子邮件”应用程序进行两处更改,以将其与邮件服务器的连接从不安全更改为安全(这将以正确的方式消除 503 错误消息):
将 fsockopen 端口参数从 25 更改为 465。
将 fsockopen 主机参数方案从 (空) 更改为 ssl:// 。因此,如果主机是“mail.example.com”,则将其更改为“ssl://mail.example.com”。
可能还需要在 httpd.conf 文件中启用“LoadModule ssl_module modules/mod_ssl.so”行(用于本地 Apache 服务器)或进行其他本地更改以使 PHP 互联网传输正常工作。我对此不确定。只有这两个更改对我来说立即有效。