fsockopen():无法连接,不适用于PHP(连接超​​时)

时间:2018-07-22 13:38:26

标签: php sockets smtp

我有此代码:

$domain = 'massag.com';

$hosts = array();
$mxweights = array();
getmxrr($domain, $hosts, $mxweights);

var_dump($hosts);
var_dump($mxweights);

$host = gethostbynamel($hosts[0])[0];
var_dump($host);

$f = @fsockopen($host, 25, $errno, $errstr, 10);

if(!$f) {
    var_dump('NOT CONNECTED');
}

它没有连接到smtp服务器,但是当我使用命令

  

smtp:217.196.209.9

mxtoolbox.com上已连接。

我在用PHP代码做错什么了吗? 我已经尝试将$host替换为smtp.massag.com,但没有帮助。

2 个答案:

答案 0 :(得分:1)

使用dig查询所提供的IP或其反向DNS,它表明没有MX记录,因此可能会出现错误。

dig -x 217.196.209.9 MX | grep 'IN.*MX'
;9.209.196.217.in-addr.arpa.    IN      MX

dig smtp.miramo.cz MX | grep 'IN.*MX'
;smtp.miramo.cz.                        IN      MX

但是在massag.com上返回结果

dig massag.com MX | grep 'IN.*MX'
;massag.com.                    IN      MX
massag.com.             85375   IN      MX      20 miramo3.miramo.cz.
massag.com.             85375   IN      MX      10 smtp.miramo.cz.

最后,添加一些测试以避免不必要的错误并使用工作域

<?php
$domain = 'massag.com';

if(getmxrr($domain, $hosts, $mxweights)){
    print_r($hosts);
    print_r($mxweights);
    if(count($hosts) > 0){
        $host = gethostbynamel($hosts[0])[0];
        print("Found host: " . $host . "\n");

        $f = fsockopen($host, 25, $errno, $errstr, 10);

        if(!$f){
            var_dump('NOT CONNECTED');
        }
    }else{
        print("no MX record found\n");
    }
}
?>

使用tutorialspoint.com作为域的结果:

    Array
(
    [0] => ALT2.ASPMX.L.GOOGLE.com
    [1] => ASPMX.L.GOOGLE.com
    [2] => ALT1.ASPMX.L.GOOGLE.com
    [3] => ALT4.ASPMX.L.GOOGLE.com
    [4] => ALT3.ASPMX.L.GOOGLE.com
)
Array
(
    [0] => 5
    [1] => 1
    [2] => 5
    [3] => 10
    [4] => 10
)
Found host: 74.125.128.26

使用OP(massag.com)提供的域

    Array
(
    [0] => smtp.miramo.cz
    [1] => miramo3.miramo.cz
)
Array
(
    [0] => 10
    [1] => 20
)
Found host: 217.196.209.9

答案 1 :(得分:0)

我用fig, axes = plt.subplots(nrows=1, ncols=2) j = 0 for ax in axes.flat: if j == 0: Z = sensi_n_M(X,Y,n) varName = 'vegetation coverage' label = 'dM/M' elif j == 1: Z = sensi_n_AS(X,Y,n) varName = 'average slope' label = r'{dtan\beta/tan\beta}' title1 = ax.set_title(r'$\frac{dn/n}{'+label+'}$'+'\n', fontsize=25) ylabel=ax.yaxis.set_label_text('average slope') ylabel.set_fontsize(15) xlabel=ax.xaxis.set_label_text('vegetation coverage') xlabel.set_fontsize(15) for tick in ax.xaxis.get_major_ticks(): tick.label1.set_fontsize(10) for tick in ax.yaxis.get_major_ticks(): tick.label1.set_fontsize(10) fill = ax.contourf(X, Y, Z, rstride=1, cstride=1, #clevs, #edgecolors = 'r', cmap=plt.cm.RdBu_r,vmin=-2.4,vmax=1.2) j = j+1 v = np.linspace(-2.4,1.2,13) fig.subplots_adjust(left=0.2, wspace=0.8, top=0.8) cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat]) cb = plt.colorbar(fill, cax=cax) cb.set_ticklabels(v) plt.show() fsockopen取代了socket_create函数,它的功能要好得多。函数fsockopen有时无法正确连接。