好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php利用CURL函数登入163邮箱并获取自己的通讯录

php利用CURL函数登入163邮箱并获取自己的通讯录

我们使用phpmailer登录邮件发邮件也是使用了curl原理来实现模仿用户(HdhCmsTestphpfensi测试数据)发邮件了,今天看了两个利用CURL函数登入163邮箱并获取自己的通讯录的例子.

学习了一些CURL的基础知识并做了这个示例,关于CURL的知识可以从php的官网上查看,点击查看.

示例代码调试方式:把$userName和$password换成自己163邮箱的用户名和密码即可.

注意 :用户名和密码一定要正确,否则报错,没有做容错处理,示例代码如下:

<?php  //==================账号信息==================   //用户名   $userName  =  'xxxxxxxx' ;  //密码   $password  =  'xxxxxxxx' ;  //邮箱   $email  =  $userName  .  '@163测试数据' ;  //==================登录==================   //登录地址(登录地址并不是form表单设置的地址,通过js修改了form的action属性,需要查看登录页面源码才能发现)   $loginUrl  =  "https://ssl.mail.163测试数据/entry/coremail/fcg/ntesdoor2?df=mail163_letter&from=web&funcid=loginone&iframe=1&language=-1&passtype=1&product=mail163&net=n&style=-1&race=-2_56_-2_hz&uid={$email}" ;  //登录时发送的post数据(查看form表单,注意有隐藏域)   $postArray  =  array (       "url2"  =>  "http://mail.163测试数据/errorpage/error163.htm" ,       "savelogin"  => 0,   "username"  => trim( $userName ),  "password"  =>  $password ,  );  $postString  =  '' ;  foreach ( $postArray   as   $key  =>  $value ){       $postString  .=  "{$key}={$value}&" ;  }  $postString  = trim( $postString ,  '&' );  //初始化CURL对象   $curl  = curl_init();  //设置请求地址   curl_setopt( $curl , CURLOPT_URL,  $loginUrl );  //禁用后CURL将终止从服务端进行验证   curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, FALSE);  //启用时将获取的信息以文件流的形式返回,而不是直接输出   curl_setopt( $curl , CURLOPT_RETURNTRANSFER, TRUE);  //启用时会将头文件的信息作为数据流输出   curl_setopt( $curl , CURLOPT_HEADER, TRUE);  //设置POST参数   curl_setopt( $curl , CURLOPT_POST, TRUE);  curl_setopt( $curl , CURLOPT_POSTFIELDS,  $postString );  //执行给定的CURL会话   //成功时返回 TRUE,失败时返回 FALSE   //然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE   $html  = curl_exec( $curl );  //把获取到的数据写入文件中以便查看   //file_put_contents('temp1.txt', $html);   //分割头文件和内容   list( $head ,  $content ) =  explode ( "\r\n\r\n" ,  $html , 2);  //把获取到的数据写入文件中以便查看   //file_put_contents('temp2.txt', $head);   //file_put_contents('temp3.txt', $content);   $head  =  explode ( "\r\n" ,  $head );  //获取cookie信息   $cookieString  =  '' ;  foreach  ( $head   as   $value ){       if ( stripos ( $value ,  "Set-Cookie: " ) !== false){           $cookieString  .=  str_replace ( "Set-Cookie: " ,  "" ,  $value );      }  }  //从content里分析出sid值(读取通讯录信息的参数)   $startString  =  'top.location.href = "' ;  $endString  =  '";</script>' ;  $start  =  strpos ( $content ,  $startString );  $end  =  strpos ( $content ,  $endString );  $tempUrl  =  substr ( $content ,  $start  +  strlen ( $startString ),  $end  -  $start  -  strlen ( $startString ));  $tempUrlVals  =  parse_url ( $tempUrl );  parse_str ( $tempUrlVals [ 'query' ],  $queryVals );  $sid  =  $queryVals [ 'sid' ];  //==================读取邮箱==================   //读取邮箱地址   $readUrl  =  "http://twebmail.mail.163测试数据/contacts/call.do?uid={$email}&sid={$sid}&from=webmail&cmd=newapi.getContacts&vcardver=3.0&ctype=all&attachinfos=yellowpage" ;  //设置请求地址   curl_setopt( $curl , CURLOPT_URL,  $readUrl );  //设置POST参数   curl_setopt( $curl , CURLOPT_POST, TRUE);  curl_setopt( $curl , CURLOPT_POSTFIELDS,  'order=[{"field":"N","desc":"false"}]' );  //注意这里要设置从登录操作中获取的cookie   curl_setopt( $curl , CURLOPT_COOKIE,  $cookieString );  //禁用头文件输出   curl_setopt( $curl , CURLOPT_HEADER, FALSE);  //执行给定的CURL会话   //成功时返回 TRUE,失败时返回 FALSE   //然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE   $content  = curl_exec( $curl );  //把获取到的数据写入文件中以便查看   //file_put_contents('temp4.txt', $content);   (HdhCmsTestphpfensi测试数据) //关闭一个CURL会话,并释放资源   curl_close( $curl );  echo   '<pre>' ;  print_r(json_decode( $content , true));  echo   '</pre>' ; 

例子二,这个更高级一些可以输入信息,代码如下:

<html>  <head>  <meta content= "text/html; charset=utf-8"  http-equiv= "Content-Type" />  <title>登陆163邮箱</title>  </head>  <body>  <form id= "login"  action= "mail.php"  method= "POST" >  <label  for = "username" >用户名:</label><input id= "username"  name= "username"  type= "text"  />  <label  for = "password" >密码:</label><input id= "password"  name= "password"  type= "password"  />  <input type= "submit"  value= "取得通讯录列表"  />  </form>  </body>  </html> 

mail.php,代码如下:

<?php      define( "COOKIEJAR" , ini_get (  "upload_tmp_dir"  ).DIRECTORY_SEPARATOR. "cookie.txt" );             if ( !isset( $_POST [ 'username' ]) || !isset( $_POST [ 'username' ]) ){           echo   'ERROR QUEST' ;           exit ();      }             $username  =  $_POST [ 'username' ];       $pos  =  strrpos ( $username , '@' );       if ( $pos  === false){           $username  .=  "@163测试数据" ;      }       $password  =  $_POST [ 'password' ];             //登陆163邮箱,获得登陆后的cookie        $options  =  array (        CURLOPT_URL =>  "https://reg.163测试数据/logins.jsp" ,        CURLOPT_SSL_VERIFYPEER => false,        CURLOPT_POST => 1,        CURLOPT_POSTFIELDS =>  "username=" . $username . "&password=" . $password ,        CURLOPT_COOKIEJAR => COOKIEJAR,      );      curl_quest( $options );             //利用上一步获得的cookie进一步取得cookie        $options2  =  array (        CURLOPT_URL =>  "http://fm163.163测试数据/coremail/fcg/ntesdoor2?verifycookie=1&lightweight=1" ,        CURLOPT_COOKIEFILE => COOKIEJAR,        CURLOPT_COOKIEJAR => COOKIEJAR,      );      curl_quest( $options2 );             //分析cookie文件,取得coremail.        $cookiefile  =  file_get_contents (COOKIEJAR);      preg_match( '|Coremail.*?%(\S*)|' , $cookiefile , $sid );             //发送获得通讯录xml请求.        $postStr3  = '<?xml version= "1.0" ?><object>< array  name= "items" ><object><string name= "func" >pab:searchContacts</string  ><object name= "var" >< array  name= "order" ><object><string name= "field" >FN</string><boolean name= "ignoreCase"   >true</boolean></object></ array ></object></object><object><string name= "func" >user:getSignatures</string  ></object><object><string name= "func" >pab:getAllGroups</string></object></ array ></object>';       $options3  =  array (         CURLOPT_URL =>  'http://eg1a120.mail.163测试数据/a/s?sid=' . $sid [1]. '&func=global:sequential' ,         CURLOPT_HTTPHEADER =>  array ( 'Content-Type: application/xml' ),        CURLOPT_POST => 1,        CURLOPT_COOKIEFILE => COOKIEJAR,        CURLOPT_POSTFIELDS =>  $postStr3 ,        CURLOPT_REFERER =>  'http://eg1a120.mail.163测试数据/a/f/js3/0811050934/index_v12.htm' ,      );       $mailsxml  = curl_quest( $options3 ,true);             //输出获得的通讯录xml       header( "Content-Type: application/xml" );       echo   $mailsxml ;             function  curl_quest( $ops , $return  = false){           $ch  = curl_init();          curl_setopt_array( $ch , $ops );          ob_start( );          curl_exec( $ch );           if ( $return ){               $content =ob_get_contents();          }          curl_close( $ch );          ob_end_clean();           if ( $return ){               return   $content ;          }      }    ?> 

查看更多关于php利用CURL函数登入163邮箱并获取自己的通讯录的详细内容...

  阅读:42次