我正在运行一个轻量级 SMTP 服务器来处理传入的电子邮件。我正在使用https://github.com/kennethreitz/inbox.py。我在防火墙中打开了端口 25,并在 0.0.0.0:25 运行服务器。
一切都按我预期的方式运行。当我发送电子邮件至[电子邮件保护]服务器收到消息。
让我感到奇怪的是,当我从 VPS 外部 telnet 到端口 25 时,它无法连接并且超时:
$ telnet mydomain.com 25
Trying <IP address removed>...
telnet: connect to address <IP address removed>: Operation timed out
telnet: Unable to connect to remote host
当我从 VPS 内部进行 telnet 时,它正常工作:
$ telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 hobnob Python SMTP proxy version 0.2
我想不出发生这种情况的任何原因。会是什么原因呢?
更新:
我能够使用 Python shell 建立连接:
from smtplib import SMTP
conn = SMTP('mydomain.com')
我确认如果服务器没有运行,这将失败。似乎 telnet 无法正确建立连接?我不确定,但很明显可以通过电子邮件软件连接到服务器,这正是我真正想要测试的。
答案1
造成这种情况的原因有很多。
可能是您的 VPS 提供商封锁了端口 25。许多提供商会要求您特别要求打开该端口,以帮助减少垃圾邮件。
另外,您的防火墙可能阻止了端口 25 的入站流量。请解决该问题。
另一个常见的事情是只在本地主机上监听,但是因为您已将 0.0.0.0 设置为绑定地址,所以这应该不是问题。
通常,收到的邮件会通过其他端口进入(特别是通过端口 587 提交),因此您仍可能会收到端口 25 被阻塞的邮件。
答案2
您是否检查过“mydomain.com”的 DNS MX 记录?例如:
dig +short mydomain.com MX
在 VPS 内部和外部都进行此检查:结果可能不同。
您的 VPS 提供商可能已安排外部电子邮件通过其中央邮件中继服务器进入。这样他们就可以代表用户设置针对恶意软件和其他滥用行为的保护措施。(它还可以允许其他操作,但这就是电子邮件加密的目的。)一旦邮件通过提供商的服务器,它将自动转发到您的系统。
如果已经设置了这样的中继系统,那么从互联网直接访问您的 VPS 的 25 端口可能已被阻止。
Python smtplib 可能足够智能,可以自动检查 MX 记录并自动连接到指定的中继服务器,而不是直接连接到您自己的服务器。Telnet 肯定不会。