Loading....

HEAD

  • 有一种精神,叫"公诚勤朴"

挣点外快

导出Gmail通讯录(Export Gmail Contacts)
作者: wzhu 时间: 2010-06-01 17:33:41

<?php
/*
 *****************************************************************
 * Author: wzhu.email@gmail.com
 * Date: 2010-05-26
 * Description: This is a php class  for Gmail Contacts
 *****************************************************************
 */

class Gmail
{
    private $_gClient  = null;
    private $_gAccount = null;
    private $_gPassword= null;
    private $_gService = 'cp';
    private $_gScope   = null;

    function __construct($account,$password){
        $temp = explode('@',$account);

        $this->_gAccount = $temp[0].'@gmail.com';
        $this->_gPassword= $password;
        $this->getClient();
    }

    private function getClient(){
        if($this->_gClient !== null ) return $this->_gClient;

        $this->_gClient = Zend_Gdata_ClientLogin::getHttpClient($this->_gAccount,$this->_gPassword, $this->_gService);
        return $this->_gClient;
    }
    private function getContactsGroupId($group='System Group: My Contacts'){
        $scope = 'http://www.google.com/m8/feeds/groups/'.$this->_gAccount.'/full';

        $gdata = new Zend_Gdata($this->_gClient);
        $gdata->setMajorProtocolVersion(3);
        $query = new Zend_Gdata_Query($scope);
        $query->setMaxResults(10000);
        $feed  = $gdata->retrieveAllEntriesForFeed($gdata->getFeed($query));

        foreach ($feed AS $entry){
             if( strcasecmp( $entry->title->text, $group) == 0){
                 $arrIdExplode = explode("/",$entry->id->text);
                 return $arrIdExplode[(count($arrIdExplode)-1)];
             }
        }

    }


    /**
     * Default Parameter is My Contacts
     * Can setting other Group Contacts
     * Empty Parameter is All Contacts
     */
    public function getContacts($group='System Group: My Contacts'){
        $scope = 'http://www.google.com/m8/feeds/contacts/'.$this->_gAccount.'/full';

        $gdata = new Zend_Gdata($this->_gClient);
        $gdata->setMajorProtocolVersion(3);
        $query = new Zend_Gdata_Query($scope);
        $query->setMaxResults(10000);
        $feed  = $gdata->retrieveAllEntriesForFeed($gdata->getFeed($query));

        if(!empty($group)){
            $grpid = $this->getContactsGroupId($group);
        }

        $arrContacts = Array();

        foreach ($feed AS $entry){
            $contact = Array();
            $contact['Name'] = $entry->title->text;
            $contact['Note'] = $entry->content->text;
            $ext = $entry->getExtensionElements();

            if(!empty($grpid)){
                $groupFlag = false;
            }

            foreach($ext as $extension){

                if( !empty($grpid) && $extension->rootElement == 'groupMembershipInfo' ){
                    $groupFlag = true;

                    $attr = $extension->getExtensionAttributes();
                    $itemGroupId = $attr['href']['value'];
                    if( strpos( $itemGroupId, '/base/'.$grpid)!== false ){
                        break;
                    }
                }
                if($extension->rootElement == 'email'){
                    $attr = $extension->getExtensionAttributes();
                    $contact['Mail'] = strtolower($attr['address']['value']);
                    list($t,$type) = explode('#',$attr['rel']['value']);
                    switch(strtolower($type)){
                    case 'work':  $contact['WorkMail']  = $contact['Mail']; break;
                    case 'other': $contact['OtherMail'] = $contact['Mail']; break;
                    default:      $contact['HomeMail']  = $contact['Mail']; break;
                    }
                    if(empty($contact['Name']) && !empty($contact['Mail'])){
                        $contact['Name'] = $contact['Mail'];
                    }
                }else if($extension->rootElement == 'phoneNumber'){
                    $attr = $extension->getExtensionAttributes();
                    list($t,$type) = explode('#',$attr['rel']['value']);
                    switch(strtolower($type)){
                    case 'work':     $contact['WorkPhone']   = $extension->text; break;
                    case 'mobile':   $contact['MobilePhone'] = $extension->text; break;
                    case 'other':    $contact['OtherPhone']  = $extension->text; break;
                    case 'home_fax': $contact['HomeFax']     = $extension->text; break;
                    case 'work_fax': $contact['WorkFax']     = $extension->text; break;
                    default:         $contact['HomePhone']   = $extension->text; break;
                    }
                }else if($extension->rootElement == 'organization'){
                    $attr=$extension->getExtensionElements();
                    if($attr[0]->rootElement == 'orgName'){
                        $contact['Company'] = $attr[0]->text;
                    }
                    if($attr[1]->rootElement == 'orgTitle'){
                        $contact['JobTitle'] = $attr[1]->text;
                    }
                }else if($extension->rootElement == 'structuredPostalAddress'){
                    $elements=$extension->getExtensionElements();
                    $attr    =$extension->getExtensionAttributes();
                    $addr    = null;
                    foreach($elements AS $element){
                        if($element->rootElement == 'formattedAddress'){
                            $addr .= $element->text;
                        }
                    }
                    list($t,$type) = explode('#',$attr['rel']['value']);
                    switch(strtolower($type)){
                    case 'work':  $contact['WorkAddr']  = $addr; break;
                    case 'other': $contact['OtherAddr'] = $addr break;
                    default:      $contact['HomeAddr']  = $addr; break;
                    }
                }else if($extension->rootElement == 'postalAddress'){
                    $attr = $extension->getExtensionAttributes();
                    list($t,$type) = explode('#',$attr['rel']['value']);
                    switch(strtolower($type)){
                    case 'work':  $contact['WorkAddr']  = $extension->text; break;
                    case 'other': $contact['OtherAddr'] = $extension->text; break;
                    default:      $contact['HomeAddr']  = $extension->text; break;
                    }
                }
            }

            if(!empty($grpid) && !$groupFlag){
                continue;
            }

            $name = explode('@',$contact['Name']);
            $contact['Name'] = $name[0];

            list($contact['Firstname'],$contact['Midname'],$contact['Lastname']) =  preg_split( '/[\\s\\.]+/',$contact['Name'],
            if(empty($contact['Lastname'])){
                $contact['Lastname'] = $contact['Midname'];
                $contact['Midname']  = '';
            }
            $arrContacts[] = $contact;
        }
        return $arrContacts;
    }

    public function getGmailSender($box="INBOX",$max=50) {
        $error   = array(
                'failed'=>'Import failed',
                'zero'  =>'Your "Sent Mail" folder is empty.',
                'auth'  =>'Account information is wrong or Gmail server is not available now.'
                );

        $mburl = "{imap.gmail.com:993/imap/ssl}";
        if(strcasecmp($box, 'sent mail') == 0){
            $mailurl = $mburl.'[Gmail]/Sent Mail';
        }else{
            $mailurl = $mburl.'INBOX';
        }

        $mb = @imap_open($mailurl, $this->_gAccount, $this->_gPassword);
        if($mb){
            $num = @imap_num_msg($mb);
            $arrContacts = Array();

            for($i=0; $i<$num && $i<$max; $i++) {
                $mailheader = (@imap_headerinfo ( $mb, $num-$i ));
                if(strcasecmp($box, 'sent mail') == 0){
                    $info = $mailheader->to;
                }else{
                    $info = $mailheader->from;
                }
                foreach($info as $key=>$val) {
                    $contact = array();
                    if(!empty($val->personal)){
                        $tmp = explode('@',$val->personal);
                        $personal = $tmp[0];

                        $rs = @imap_mime_header_decode($personal);

                        if( strcasecmp($rs[0]->charset,'default')!=0 ){
                            $name = @iconv($rs[0]->charset, 'UTF-8', $rs[0]->text);
                        }else{
                            $name = $rs[0]->text;
                        }
                    }else{
                        $name = $val->mailbox;
                    }

                    list($contact['Firstname'],$contact['Midname'],$contact['Lastname']) =  preg_split('/[\s\.]+/',$contact['N
                    if(empty($contact['Lastname'])){
                        $contact['Lastname'] = $contact['Midname'];
                        $contact['Midname']  = '';
                    }

                    $email = strtolower($val->mailbox.'@'.$val->host);
                    $contact['Mail'] = $email;
                }
                $arrContacts[] = $contact;
            }
            @imap_close($mbox);
            return $arrContacts;
        }else{
            throw new Exception("Gmail server or networking exception");
        }
    }
};
 

相关评论
发表评论
姓名:
图码: