Friday, April 23, 2010

Import Gmail Contacts using PHP

$location = "";
$cookiearr = array();
$csv_source_encoding='utf-8';

#function get_contacts, accepts as arguments $login (the username) and $password
#returns array of: array of the names and array of the emails if login successful
#otherwise returns 1 if login is invalid and 2 if username or password was not specified
function get_contacts($login, $password)
{
#the globals will be updated/used in the read_header function
global $csv_source_encoding;
global $location;
global $cookiearr;
global $ch;

#check if username and password was given:
if ((isset($login) && trim($login)=="") || (isset($password) && trim($password)==""))
{
#return error code if they weren't
return 2;
}

#initialize the curl session
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://www.google.com/accounts/ServiceLoginAuth?service=mail");
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');

#get the html from gmail.com
$html = curl_exec($ch);

$matches = array();
$actionarr = array();

$action = "https://www.google.com/accounts/ServiceLoginAuth?service=mail";

#parse the login form:
#parse all the hidden elements of the form
preg_match_all('/]*name\="([^"]+)"[^>]*value\="([^"]*)"[^>]*>/si', $html, $matches);
$values = $matches[2];
$params = "";

$i=0;
foreach ($matches[1] as $name)
{
$params .= "$name=" . urlencode($values[$i]) . "&";
++$i;
}

$login = urlencode($login);
$password = urlencode($password);

#submit the login form:
curl_setopt($ch, CURLOPT_URL,$action);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params ."Email=$login&Passwd=$password&PersistentCookie=");

$html = curl_exec($ch);

#test if login was successful:
if (!isset($cookiearr['GX']) && (!isset($cookiearr['LSID']) || $cookiearr['LSID'] == "EXPIRED"))
{
return 1;
}

#this is the new csv url:
curl_setopt($ch, CURLOPT_URL, "http://mail.google.com/mail/contacts/data/export?exportType=ALL&groupToExport=&out=GMAIL_CSV");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPGET, 1);

$html = curl_exec($ch);
$html = iconv ($csv_source_encoding,'utf-8',$html);

$csvrows = explode("\n", $html);
array_shift($csvrows);

$names = array();
$emails = array();
foreach ($csvrows as $row)
{
if (preg_match('/^((?:"[^"]*")|(?:[^,]*)).*?([^,@]+@[^,]+)/', $row, $matches))
{
$names[] = trim( ( trim($matches[1] )=="" ) ? current(explode("@",$matches[2])) : $matches[1] , '" ');
$emails[] = trim( $matches[2] );
}
}

return array($names, $emails);
}

#read_header is essential as it processes all cookies and keeps track of the current location url
#leave unchanged, include it with get_contacts
function read_header($ch, $string)
{
global $location;
global $cookiearr;
global $ch;
global $csv_source_encoding;

$length = strlen($string);

if (preg_match("/Content-Type: text\\/csv; charset=([^\s;$]+)/",$string,$matches))
$csv_source_encoding=$matches[1];

if(!strncmp($string, "Location:", 9))
{
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(';', $cookiestr);
$cookie = explode('=', $cookie[0]);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode('=', $cookie));
}
$cookie = "";
if(trim($string) == "")
{
foreach ($cookiearr as $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}

return $length;
}

#function to trim the whitespace around names and email addresses
#used by get_contacts when parsing the csv file
function trimvals($val)
{
return trim ($val, "\" \n");
}
function getContacts($username = null, $password = null){

$login = $username;
$password = $password;

$resultarray = get_contacts($login, $password);
if(count($resultarray) >0 ){
    foreach($resultarray as $res){
        $emailArray['email'] = $res;
    }
    return $emailArray;
}else{
    return 0;
}


}


To Get the Contacts Imported use the below function...


print_r(getContacts("Gmail Username","Gmail Password"));

10 comments:

Rajeev kumar baghel said...

Thanks for it anil .
this code is very usefull every one .
pls tell me some in this code.
$location = "";
$cookiearr = array();
what the function these function.


Thanks
rajeev kumar
rajeev.kumar059@gmail.com

Rajeev kumar baghel said...

i want to mad search engine like as google but i have no ideas for it b/c i am learner of php so please help me if u made it pls sent me code on my mail in .


Thanks.
rajeev.kumar059@gmail.com

dskanth said...

Hi, i would like to display the names of the contacts, along with their email ids. Can this be done ?

Anil Kumar said...

Hi Raj...

Sorry for the late reply, $location is a global variable used in the functions & $cookiearr is declared as an array.....
nothing more than that......

Anil Kumar said...

@dskanth

In the function getContacts, in foreach loop we are retrieving as email, change it to First name & try it....I think it works....

Sonal Khunt said...

hello
I try this example but its not working
its return
Array ( [email] => Array ( ) )
blank array

can you please help me...

Wilhem said...

same here, i got only Array ( [email] => Array ( ) )
blank array

Anil Kumar said...

It is working fine for me.....there is no Problem to import contacts from Gmail.....

mani said...

Warning: Invalid argument supplied for foreach() in H:\btechguru\gmail\test.php on line 152

Notice: Undefined variable: emailArray in H:\btechguru\gmail\test.php on line 155

i got this error.. pls help me

Anil Kumar said...

Hello Guys...the code which the above I've used is not working fine as Google made some changes in getting the contact details. We need to OAuth functions in PHP to retrieve the contacts list...

Presently, I'm working on it...I'll update it once I finish with it...Sorry for the probm