2016-05-11 68 views
2

大家好,请看看下面的代码,帮我找出这个问题..“不支持SSL协议版本”当试图调用API SendGrid

$tos='[email protected]'; 
$subject09='hello madam223'; 
$messageto90='this is a test'; 
$myName_emailis='Sonam verma'; 
    $emaillist_act=array('[email protected]','[email protected]'); 
    $json_string = array('to' =>$emaillist_act,'category' => 'activity'); 

    $url = 'https://api.sendgrid.com/'; 
$user = 'username'; 
$pass = 'password'; 
$params = array(
'api_user' => $user, 
'api_key' => $pass, 
'x-smtpapi' => json_encode($json_string), 
'to'  => "$tos", 
'subject' => "$subject09", 
'html'  => "$messageto90", 
'fromname' => $myName_emailis, 
'from'  => "domain.com <[email protected]>" 
); 
$request = $url.'api/mail.send.json'; 
// Generate curl request 
    $session = curl_init($request); 
// Tell curl to use HTTP POST 
curl_setopt ($session, CURLOPT_POST, true); 
// Tell curl that this is the body of the POST 
curl_setopt ($session, CURLOPT_POSTFIELDS, $params); 
// Tell curl not to return headers, but do return the response 
curl_setopt($session, CURLOPT_HEADER, false); 
    // Tell PHP not to use SSLv3 (instead opting for TLS) 
    @curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
    // obtain response 
    $response = curl_exec($session); 
    curl_close($session); 
    print_r($response); 
    ?> 

此代码工作其他服务器http://www.reurl.in/6626fdd53 上但它不会在我的服务器上做任何事情http://www.reurl.in/26cbacc87 它dosent打印它应该打印响应成功或失败等。

此代码在两个服务器上都很好。

<?php 
    //Your authentication key 
    $authKey = "somethingapikey"; 

    //Multiple mobiles numbers separated by comma 
    $mobileNumber = "$mobileno"; 

    //Sender ID,While using route4 sender id should be 6 characters long. 
    $senderId = "something"; 

    //Your message to send, Add URL encoding here. 

    if(strlen($textsms) > 300){ 
    $message = urlencode(substr($textsms,0,300)); 
     $message=$message.'...'. ' www.domain.com';  
     }else{ 
     $textsms=$textsms.' www.domain.com';  
     $message = urlencode($textsms);  
     } 


    //Define route 
    $route = "domain"; 
    //Prepare you post parameters 
    $postData = array(
'authkey' => $authKey, 
'mobiles' => $mobileNumber, 
'message' => $message, 
'sender' => $senderId, 
'route' => $route 
); 
    //API URL 
    $url="https://control.msg91.com/api/sendhttp.php"; 
    // init the resource 
    $ch = curl_init(); 
    curl_setopt_array($ch, array(
CURLOPT_URL => $url, 
CURLOPT_RETURNTRANSFER => true, 
CURLOPT_POST => true, 
CURLOPT_POSTFIELDS => $postData 
//,CURLOPT_FOLLOWLOCATION => true 
)); 

    //Ignore SSL certificate verification 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 

    //get response 
    $output = curl_exec($ch); 
    //Print error if any 
    //if(curl_errno($ch)) 
     //{ 
    // echo 'error:' . curl_error($ch); 
    //} 
    curl_close($ch); 
    //echo $output; 
    ?> 

请帮我缩小的问题,因为这对我来说很重要,请... 我的服务器管理员说,他们不能帮助。

我也缩小了问题,我们有卷曲版本7.38.0和其他服务器有7.19.7

所有错误reportings上,但仍然我没有得到任何东西没有错误没有成功没有邮件。

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

加入

$error = curl_error($session); 
echo $error; 

后,我得到

Unsupported SSL protocol version 
+0

它已经在我用ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(E_ALL); –

+0

让我检查一下,请。 –

+0

如何检查我应该在参数中输入什么? –

回答

2

尝试使用不同的SSL协议版本。

更改行:

@curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 

尝试这些可能的常量来看看哪一个:

CURL_SSLVERSION_TLSv1 
CURL_SSLVERSION_SSLv2 
CURL_SSLVERSION_SSLv3 
CURL_SSLVERSION_TLSv1_0 
CURL_SSLVERSION_TLSv1_1 
CURL_SSLVERSION_TLSv1_2 

另外:从行的开头删除@。 @suppresses错误。发生任何错误时,您都希望得到错误。

如果两者均不起作用,服务器上可能不支持所需的ssl协议版本。然后您需要更新服务器上使用的CURL或OPENSSL。

3

为了速战速决,添加curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false);

$tos='[email protected]'; 
$subject09='hello madam223'; 
$messageto90='this is a test'; 
$myName_emailis='Sonam verma'; 
    $emaillist_act=array('[email protected]','[email protected]'); 
    $json_string = array('to' =>$emaillist_act,'category' => 'activity'); 

    $url = 'https://api.sendgrid.com/'; 
$user = 'username'; 
$pass = 'password'; 
$params = array(
'api_user' => $user, 
'api_key' => $pass, 
'x-smtpapi' => json_encode($json_string), 
'to'  => "$tos", 
'subject' => "$subject09", 
'html'  => "$messageto90", 
'fromname' => $myName_emailis, 
'from'  => "domain.com <[email protected]>" 
); 
$request = $url.'api/mail.send.json'; 
// Generate curl request 
    $session = curl_init($request); 
// Tell curl to use HTTP POST 
curl_setopt ($session, CURLOPT_POST, true); 
// Tell curl that this is the body of the POST 
curl_setopt ($session, CURLOPT_POSTFIELDS, $params); 
// Tell curl not to return headers, but do return the response 
curl_setopt($session, CURLOPT_HEADER, false); 
curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false); 
    // Tell PHP not to use SSLv3 (instead opting for TLS) 
    @curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
    // obtain response 
    $response = curl_exec($session); 
    curl_close($session); 
    print_r($response); 
    ?> 

警告:将CURLOPT_SSL_VERIFYPEER设置为false允许进行中间人攻击。

另一种解决方案

如果你的PHP安装不具有跟上时代的CA根证书捆绑,下载一个在卷曲的网站,并将其保存在服务器上:

http://curl.haxx.se/docs/caextract.html

然后在你的php.ini文件中设置一个路径,例如在Windows上:

curl.cainfo=c:\php\cacert.pem 

关闭CURLOPT_SSL_VERIFYPEER允许中间人(MITM)攻击,你不想要的!