Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
升级PHP会导致SMTP授权失败_Php_Email_Smtp - Fatal编程技术网

升级PHP会导致SMTP授权失败

升级PHP会导致SMTP授权失败,php,email,smtp,Php,Email,Smtp,我将centos服务器上的PHP升级到5.6.25 升级完成后,一切正常,但几个小时后,我接到客户的电话,说发送的邮件没有送达收件人 然后我发现发送的邮件是从webmail发送的,但是使用我们的PHP代码发送的邮件没有发送 在检查PHP代码的结果后,我发现了错误 身份验证失败[SMTP:STARTTLS失败(代码:220,响应:TLS继续)] 请帮我解决这个问题。我找到了这个问题的解决方案 只需转到usr/local/lib/php/Net路径可能因操作系统而异,但最后它是php目录中的Net目

我将centos服务器上的PHP升级到5.6.25 升级完成后,一切正常,但几个小时后,我接到客户的电话,说发送的邮件没有送达收件人

然后我发现发送的邮件是从webmail发送的,但是使用我们的PHP代码发送的邮件没有发送

在检查PHP代码的结果后,我发现了错误

身份验证失败[SMTP:STARTTLS失败(代码:220,响应:TLS继续)]


请帮我解决这个问题。

我找到了这个问题的解决方案

只需转到usr/local/lib/php/Net路径可能因操作系统而异,但最后它是php目录中的Net目录

在此目录中查找文件SMTP.php。 在这个文件中找到函数auth(--parameter list--),在这个文件中,他首先使用if语句

if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=')
        && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
        && strncasecmp($this->host, 'ssl://', 6) !== 0
    )
只需做如下更改

if ($tls && version_compare(PHP_VERSION, '6.1.0', '>=')
        && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
        && strncasecmp($this->host, 'ssl://', 6) !== 0
    )
由于我已经更新了系统,它现在得到以下条件为真,它正在检查openssl和STARTTLS,系统在此阶段失败

version_compare(PHP_VERSION, '5.1.0', '>=')

所以,只需将您的版本更改为必须大于升级版本的其他版本,这样第一个条件将再次为false,系统将不会进一步检查,并且将在不使用TLS的情况下进行连接

我找到了这个问题的解决方案

只需转到usr/local/lib/php/Net路径可能因操作系统而异,但最后它是php目录中的Net目录

在此目录中查找文件SMTP.php。 在这个文件中找到函数auth(--parameter list--),在这个文件中,他首先使用if语句

if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=')
        && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
        && strncasecmp($this->host, 'ssl://', 6) !== 0
    )
只需做如下更改

if ($tls && version_compare(PHP_VERSION, '6.1.0', '>=')
        && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
        && strncasecmp($this->host, 'ssl://', 6) !== 0
    )
由于我已经更新了系统,它现在得到以下条件为真,它正在检查openssl和STARTTLS,系统在此阶段失败

version_compare(PHP_VERSION, '5.1.0', '>=')

所以,只需将您的版本更改为必须大于升级版本的其他版本,这样第一个条件将再次为false,系统将不会进一步检查,并且将在不使用TLS的情况下进行连接

我也遇到了同样的问题,并偶然发现了解决方案,这些问题显然与PHP5.6中的更改有关(我对这些都不满意)

  • verify_peer和verify_peer_name现在默认设置为true-要求流式端口中涉及的两台机器之间具有额外的安全级别。当我处理SMTP时,我不希望出现这种情况,STARTTLS加密对我来说已经足够了。 所以关闭这些,我在Net/SMTP.php文件中添加了一些代码

    $options=array('ssl'=>array('verify_peer_name'=>false,'verify_peer'=>false))

    $result=$this->\u socket->connect($this->host,$this->port, $persistent、$timeout、$options)

  • 此函数未使用php.ini中指定的套接字超时默认值。因此,我将“smtp.php”中的默认值更改为:

    $timeout=60;//先前无效

  • 希望这能帮助别人。 干杯
    Murray

    我也遇到了同样的问题,并偶然发现了解决方案,这些问题显然与PHP5.6中的更改有关(我对此并不满意)

  • verify_peer和verify_peer_name现在默认设置为true-要求流式端口中涉及的两台机器之间具有额外的安全级别。当我处理SMTP时,我不希望出现这种情况,STARTTLS加密对我来说已经足够了。 所以关闭这些,我在Net/SMTP.php文件中添加了一些代码

    $options=array('ssl'=>array('verify_peer_name'=>false,'verify_peer'=>false))

    $result=$this->\u socket->connect($this->host,$this->port, $persistent、$timeout、$options)

  • 此函数未使用php.ini中指定的套接字超时默认值。因此,我将“smtp.php”中的默认值更改为:

    $timeout=60;//先前无效

  • 希望这能帮助别人。 干杯 默里