如何使用PHP检查端口465和587是否开放?

15

我想使用PHPMailer通过SMTP和Gmail发送电子邮件。我正在尝试使用的确切脚本在其他服务器上运行良好,但无法在这个特定的托管公司的服务器上正常工作。

我已检查了phpinfo(),并告诉我allow_url_fopenon,而且没有像fopen这样的disabled_functions列出。

该脚本失败,并告诉我:

SMTP -> ERROR: Failed to connect to server: Connection timed out (110) 
否则
SMTP Error: Could not authenticate.

我认为这是因为它无法连接,因为在其他服务器上运行,并且验证凭据是正确的。

所以我更一般地问,是否有一种方法可以使用PHP或jailshell ssh来检查并查看端口是否实际上是开放的还是关闭的?

1个回答

24

您可以使用fsockopen检查开放/可用端口:

$fp = fsockopen('127.0.0.1', 25, $errno, $errstr, 5);
if (!$fp) {
    // port is closed or blocked
} else {
    // port is open and available
    fclose($fp);
}

...其中5是超时时间,以秒为单位,直到调用失败。

这可能是由于防火墙问题导致的,您的托管提供程序阻止您连接到出站套接字和/或特定端口。请注意,阻止出站SMTP端口是非常常见的安全配置。过去,只有25号端口被封锁,但我开始看到更多的SSL变体也被封锁了。

大多数提供商和托管公司只允许您连接到它们自己的SMTP服务器,以防止垃圾邮件中继。


顺便说一句,这是PHPMailer用来连接SMTP服务器的相同方法(除了超时时间和重试次数更长)。 - webbiedave
谢谢。我还学到了,即使端口是开放的,有时中继也会被禁用。有没有办法用PHP检查这个? - cwd
@cwd:您需要使用fsockopen返回的句柄发送适当的SMTP命令,并使用fwritefread检查响应。 - netcoder
@netcoder - 有什么提示吗?问题是我正在使用PHPMailer库,但我认为远程服务器上的防火墙没有设置允许中继,所以我相信PHPMailer实际上正在尝试与本地SMTP客户端握手,尽管它没有意识到这一点,因此返回一个“从服务器未接受密码:535身份验证数据不正确”的错误(针对错误的服务器)。如果有一种方法可以检查这个问题,或者如果PHPMailer可以检查这个问题,那就太好了。顺便说一句,你很好地解决了防火墙方面的问题。感谢你的出色回答。 - cwd
非常感谢!我在我的论坛中设置了smtp.googlemail.com作为SMTP服务器。它长期以来一直运行良好,直到最近停止工作。经过漫长而令人沮丧的调查,我找到了你的答案,并且它完美地解释了正在发生的事情:我的提供商将出站SMTP连接重定向到本地主机,其中身份验证失败。 - Helge Klein
这对我似乎没有起作用。尽管本地主机上没有任何进程监听端口81,但我仍然不断收到$fp = false的消息。可能出了什么问题? - Yahya Uddin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接