如何通过PHP检查脚本是否连接到SMTP服务器

如何通过PHP检查脚本是否连接到SMTP服务器,php,exchange-server,Php,Exchange Server,只是标题上写的。 想知道如何检查连接是否正常工作,如果不正常,错误是什么。 顺便说一句,SMTP服务器是exchange 2007。如果您想知道是否可以从运行PHP的任何位置访问SMTP服务器,则只需在相应的端口(默认为25)上连接到它,然后查看是否在结果中返回“220”代码 $f = fsockopen('smtp host', 25) ; if ($f !== false) { $res = fread($f, 1024) ; if (strlen($res) > 0

只是标题上写的。 想知道如何检查连接是否正常工作,如果不正常,错误是什么。
顺便说一句,SMTP服务器是exchange 2007。

如果您想知道是否可以从运行PHP的任何位置访问SMTP服务器,则只需在相应的端口(默认为25)上连接到它,然后查看是否在结果中返回“220”代码

$f = fsockopen('smtp host', 25) ;
if ($f !== false) {
    $res = fread($f, 1024) ;
    if (strlen($res) > 0 && strpos($res, '220') === 0) {
        echo "Success!" ;
    }
    else {
        echo "Error: " . $res ;
    }
}
fclose($f) ;

因为这很可能与你的另一个问题有关,我也会在这里给出答案:


你使用的是PEAR邮件包。
send()
方法在成功时返回TRUE,否则返回
PEAR\u Error
对象,该对象将包含失败的详细信息。很可能您需要$PEAR_Error::message。此处的完整详细信息:

这可能是因为防火墙上不允许使用SMTP端口,所以请尝试使用此php脚本检查打开的端口,这是最常用的端口检查:

<?php

$ports[] = array('host'=>'interspire.smtp.com','number'=>25);
$ports[] = array('host'=>'interspire.smtp.com','number'=>2525);
$ports[] = array('host'=>'interspire.smtp.com','number'=>25025);
$ports[] = array('host'=>'helpme.interspire.smtp.com','number'=>80);

$ports[] = array('host'=>'google.com','number'=>80);
$ports[] = array('host'=>'smtp.gmail.com','number'=>587);
$ports[] = array('host'=>'smtp.gmail.com','number'=>465);
$ports[] = array('host'=>'pop.gmail.com','number'=>995);
$ports[] = array('host'=>'imap.gmail.com','number'=>993);

$ports[] = array('host'=>'ftp.mozilla.org','number'=>21);
$ports[] = array('host'=>'smtp2go.com','number'=>8025);

$ports[] = array('host'=>'relay.dnsexit.com','number'=>25);
$ports[] = array('host'=>'relay.dnsexit.com','number'=>26);
$ports[] = array('host'=>'relay.dnsexit.com','number'=>940);
$ports[] = array('host'=>'relay.dnsexit.com','number'=>8001);
$ports[] = array('host'=>'relay.dnsexit.com','number'=>2525);
$ports[] = array('host'=>'relay.dnsexit.com','number'=>80);

$ports[] = array('host'=>'mail.authsmtp.com','number'=>23);
$ports[] = array('host'=>'mail.authsmtp.com','number'=>25);
$ports[] = array('host'=>'mail.authsmtp.com','number'=>26);
$ports[] = array('host'=>'mail.authsmtp.com','number'=>2525);

foreach ($ports as $port)
{
    //$connection = @fsockopen($port['host'], $port['number']);
    $connection = @fsockopen($port['host'], $port['number'], $errno, $errstr, 5); // 5 second timeout for each port.

    if (is_resource($connection))
    {
        echo '<h2>' . $port['host'] . ':' . $port['number'] . ' ' . '(' . getservbyport($port, 'tcp') . ') is open.</h2>' . "\n";

        fclose($connection);
    }

    else
    {
        echo '<h2>' . $port['host'] . ':' . $port['number'] . ' is not responding.</h2>' . "\n";
    }
}


?>

来源:

就在
fclose($f)之前添加行
fwrite($f,'QUIT'。“\r\n”)。如果没有这种礼貌的退出,windows上的cpu内核将陷入恐慌,达到100%。