【问题标题】:How can I check if ports 465 and 587 are open with PHP?如何检查端口 465 和 587 是否使用 PHP 开放?
【发布时间】:2012-04-25 01:00:32
【问题描述】:

我正在尝试使用 PHPMailer 通过 SMTP 和 gmail 发送电子邮件。正在使用的确切脚本可在其他服务器上运行,但不适用于该特定托管公司的服务器。

我检查了phpinfo(),它告诉我allow_url_fopenon,并且没有列出disabled_functionsfopen

脚本失败,它告诉我:

SMTP -> ERROR: Failed to connect to server: Connection timed out (110) 

否则

SMTP Error: Could not authenticate.

我假设这是因为它无法连接,因为这又在其他服务器上工作并且身份验证凭据是正确的。

所以我更一般地问,有没有一种方法可以使用 PHP 或 jailshell ssh 来检查端口是否真的打开了?

【问题讨论】:

    标签: php linux smtp ports


    【解决方案1】:

    您可以使用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 服务器,以防止垃圾邮件发送者转发垃圾邮件。

    【讨论】:

    • +1 作为记录,这与 PHPMailer 用于连接 SMTP 服务器的方法相同(除了更长的超时和重试)。
    • 谢谢。我还了解到,即使端口打开,有时中继也会被禁用。有什么方法可以用 PHP 来检查吗?
    • @cwd:您需要发送适当的 SMTP 命令,并在 fsockopen 返回的句柄上使用 fwritefread 检查响应。
    • @netcoder - 关于这些的任何提示?问题是我使用的是 PHPMailer 库,但我认为远程服务器上的防火墙没有设置为允许中继,所以我相信 PHPMailer 实际上是在尝试与本地 SMTP 客户端握手,尽管它没有意识到这一点,因此返回 Password not accepted from server: 535 Incorrect authentication data 错误(针对错误的服务器)。如果有办法检查,或者 PHPMailer 检查了,那就太好了。 ps:你把防火墙方面搞定了。感谢您的精彩回答。
    • 非常感谢!我在我的论坛中将 smtp.googlemail.com 设置为 SMTP 服务器。它工作了很长时间,直到最近停止了。经过漫长而令人沮丧的调查,我找到了您的答案,它完美地解释了正在发生的事情:我的提供商将传出 SMTP 连接重定向到身份验证失败的本地主机。
    猜你喜欢
    • 2013-03-25
    • 2012-07-29
    • 2015-10-16
    • 2017-09-03
    • 1970-01-01
    • 2012-08-03
    • 2013-10-12
    • 2014-12-04
    相关资源
    最近更新 更多