php ssl 发送邮件:fsockopen SSL routines:ssl3_get_server_certificate:certificate verify failed

php5.6版本以上发送的时候,报错:

image.png

官方说明:

It appears that in PHP 5.6.0 (at least the version in Debian jessie, with openssl 1.0.1h-3), this function *is* now validating SSL certificates (in a variety of ways). First, it appears to fail for untrusted certificates (i.e. no matching CA trusted locally), and secondly, it appears to fail for mismatched hostnames in the request and certificate.


解决方法:

1.设置openssl.cafile设置需要指向用于在远程主机上签名SSL证书的CA证书(此方法未验证)

2.禁用验证,fsockopen不支持流上下文,所以请改用stream_socket_client。它返回一个可用于fsockopen资源所有命令的资源。代码:

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

$context = stream_context_create($contextOptions);


$this->smtp_conn = stream_socket_client("ssl://{$host}:{$port}", $errno, $errstr, 20, STREAM_CLIENT_CONNECT, $context);

3. 用swiftmailer的添加streamoptions参数进行设置

      'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => env('MAIL_HOST'),
                'username' => env('MAIL_USERNAME'),
                'password' => env('MAIL_PASSWORD'),
                'port' => env('MAIL_PORT'),
                'encryption' => env('MAIL_ENCRYPTION'),
                'streamoptions' => array(
                    'ssl' => array(
                        'verify_peer'      => false, 
                        'verify_peer_name' => false,
                    ),
                ),
            ],