2014-07-01 20 views
14

Ho scaricato il nuovo codice sorgente dell'API Gmail dalla libreria client di Google PHP.Lettura di messaggi da Gmail, in PHP, utilizzando l'API Gmail

ho parametrizzata il servizio utilizzando:

set_include_path("./google-api-php-client-master/src/".PATH_SEPARATOR.get_include_path()); 

require_once 'Google/Client.php'; 
require_once 'Google/Service/Gmail.php'; 

$client = new Google_Client(); 
$client->setClientId($this->config->item('gmailapi_clientid')); 
$client->setClientSecret($this->config->item('gmailapi_clientsecret')); 
$client->setRedirectUri(base_url('auth')); 
$client->addScope('email'); 
//$client->addScope('profile');  
$client->addScope('https://mail.google.com');   
$client->setAccessType('offline'); 

$gmailService = new Google_Service_Gmail($client); 

Che cosa devo fare dopo? Come leggere i messaggi di Gmail usando la libreria PHP dell'API di Gmail?

risposta

2

mi piacerebbe iniziare qui: https://developers.google.com/gmail/api/v1/reference/users/messages/list e https://developers.google.com/gmail/api/v1/reference/users/messages/get

nota che quando si ottiene un elenco di messaggi solo gli ID di quei messaggi restituiti quindi si utilizza l'ID con il metodo GET per ottenere effettivamente il contenuto del messaggio:

+1

Grazie. Sai come ottenere il corpo del messaggio con PHP? $ Msg> getPayload() -> getParts() -> getBody(); non è possibile ottenere il contenuto della libreria php – Anandhan

+0

per gmail api è stata completata? – Anandhan

+0

È vero, otteniamo solo un elenco di messaggi con il suo ID. Il problema è come utilizzare ogni ID per ottenere il suo messaggio, e io sto cercando di passare attraverso la documentazione di google, ma non riesco a trovare alcun indizio. –

16

Per ragioni di dimostrazione, si può fare qualcosa di simile:

 $optParams = []; 
     $optParams['maxResults'] = 5; // Return Only 5 Messages 
     $optParams['labelIds'] = 'INBOX'; // Only show messages in Inbox 
     $messages = $service->users_messages->listUsersMessages('me',$optParams); 
     $list = $messages->getMessages(); 
     $messageId = $list[0]->getId(); // Grab first Message 


     $optParamsGet = []; 
     $optParamsGet['format'] = 'full'; // Display message in payload 
     $message = $service->users_messages->get('me',$messageId,$optParamsGet); 
     $messagePayload = $message->getPayload(); 
     $headers = $message->getPayload()->getHeaders(); 
     $parts = $message->getPayload()->getParts(); 

     $body = $parts[0]['body']; 
     $rawData = $body->data; 
     $sanitizedData = strtr($rawData,'-_', '+/'); 
     $decodedMessage = base64_decode($sanitizedData); 

     var_dump($decodedMessage); 
+0

Grazie mille. è possibile ottenere i dettagli del messaggio usando la funzione listUersMessages(). Perché è molto lento quando si caricano i primi venti messaggi con i dettagli del messaggio – Anandhan

+1

Grazie mille, mi manchi sanitizedData puoi spiegare perché dobbiamo farlo? –

+1

@ Jean-LucBarat, ho trovato una spiegazione migliore di quello che mi sarebbe venuto in mente. Il merito va a joesmo Ci sono ulteriori specifiche di base64. Ma in sostanza hai bisogno di 65 caratteri per codificare: 26 minuscole + 26 maiuscole + 10 cifre = 62. Hai bisogno di due ulteriori ['+', '/'] e un carattere di riempimento '='. Ma nessuno di loro è amico dell'URL, quindi usa solo caratteri diversi per loro e sei pronto. Quelli standard del grafico sopra sono ['-', '_'], ma potresti usare altri caratteri purché li decodifichi allo stesso modo e non sia necessario condividerli con altri. – Muffy

8

questa è la funzione completa, è possibile utilizzarlo perché ha funzionato bene.

session_start(); 
     $this->load->library('google'); 
     $client = new Google_Client(); 
     $client->setApplicationName('API Project'); 
     $client->setScopes(implode(' ', array(Google_Service_Gmail::GMAIL_READONLY))); 
     //Web Applicaion (json) 
     $client->setAuthConfigFile('key/client_secret_105219sfdf2456244-bi3lasgl0qbgu5hgedg9adsdfvqmds5c0rkll.apps.googleusercontent.com.json'); 

     $client->setAccessType('offline');  

     // Redirect the URL after OAuth 
     if (isset($_GET['code'])) { 
      $client->authenticate($_GET['code']); 
      $_SESSION['access_token'] = $client->getAccessToken(); 
      $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
      header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
     } 

     // If Access Toket is not set, show the OAuth URL 
     if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 
      $client->setAccessToken($_SESSION['access_token']); 
     } else { 
      $authUrl = $client->createAuthUrl(); 
     } 

     if ($client->getAccessToken()) { 

      $_SESSION['access_token'] = $client->getAccessToken(); 

      // Prepare the message in message/rfc822 
      try { 

       // The message needs to be encoded in Base64URL 

       $service = new Google_Service_Gmail($client); 

       $optParams = []; 
       $optParams['maxResults'] = 5; // Return Only 5 Messages 
       $optParams['labelIds'] = 'INBOX'; // Only show messages in Inbox 
       $messages = $service->users_messages->listUsersMessages('me',$optParams); 
       $list = $messages->getMessages(); 
       $messageId = $list[0]->getId(); // Grab first Message 


       $optParamsGet = []; 
       $optParamsGet['format'] = 'full'; // Display message in payload 
       $message = $service->users_messages->get('me',$messageId,$optParamsGet); 
       $messagePayload = $message->getPayload(); 
       $headers = $message->getPayload()->getHeaders(); 
       $parts = $message->getPayload()->getParts(); 

       $body = $parts[0]['body']; 
       $rawData = $body->data; 
       $sanitizedData = strtr($rawData,'-_', '+/'); 
       $decodedMessage = base64_decode($sanitizedData); 

     var_dump($decodedMessage); 

      } catch (Exception $e) { 
       print($e->getMessage()); 
       unset($_SESSION['access_token']); 
      } 

     } 

    // If there is no access token, there will show url 
    if (isset ($authUrl)) { 
      echo $authUrl; 
     } 
0

Questo è il codice di esempio che ho utilizzato per sviluppare un sistema di ticketing della posta elettronica. Mostra come recuperare etichette, messaggi e intestazioni.

<?php 
require_once __DIR__ . '/vendor/autoload.php'; 


define('APPLICATION_NAME', 'Gmail API PHP Quickstart'); 
define('CREDENTIALS_PATH', '~/.credentials/gmail-php-quickstart.json'); 
define('CLIENT_SECRET_PATH', __DIR__ . '/client_secret.json'); 
// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/gmail-php-quickstart.json 
define('SCOPES', implode(' ', array(
    Google_Service_Gmail::GMAIL_READONLY) 
)); 

if (php_sapi_name() != 'cli') { 
    throw new Exception('This application must be run on the command line.'); 
} 

/** 
* Returns an authorized API client. 
* @return Google_Client the authorized client object 
*/ 
function getClient() { 
    $client = new Google_Client(); 
    $client->setApplicationName(APPLICATION_NAME); 
    $client->setScopes(SCOPES); 
    $client->setAuthConfig(CLIENT_SECRET_PATH); 
    $client->setAccessType('offline'); 

    // Load previously authorized credentials from a file. 
    $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH); 
    if (file_exists($credentialsPath)) { 
    $accessToken = json_decode(file_get_contents($credentialsPath), true); 
    } else { 
    // Request authorization from the user. 
    $authUrl = $client->createAuthUrl(); 
    printf("Open the following link in your browser:\n%s\n", $authUrl); 
    print 'Enter verification code: '; 
    $authCode = trim(fgets(STDIN)); 

    // Exchange authorization code for an access token. 
    $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); 

    // Store the credentials to disk. 
    if(!file_exists(dirname($credentialsPath))) { 
     mkdir(dirname($credentialsPath), 0700, true); 
    } 
    file_put_contents($credentialsPath, json_encode($accessToken)); 
    printf("Credentials saved to %s\n", $credentialsPath); 
    } 
    $client->setAccessToken($accessToken); 

    // Refresh the token if it's expired. 
    if ($client->isAccessTokenExpired()) { 
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 
    file_put_contents($credentialsPath, json_encode($client->getAccessToken())); 
    } 
    return $client; 
} 

/** 
* Expands the home directory alias '~' to the full path. 
* @param string $path the path to expand. 
* @return string the expanded path. 
*/ 
function expandHomeDirectory($path) { 
    $homeDirectory = getenv('HOME'); 
    if (empty($homeDirectory)) { 
    $homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH'); 
    } 
    return str_replace('~', realpath($homeDirectory), $path); 
} 

/** 
* Get list of Messages in user's mailbox. 
* 
* @param Google_Service_Gmail $service Authorized Gmail API instance. 
* @param string $userId User's email address. The special value 'me' 
* can be used to indicate the authenticated user. 
* @return array Array of Messages. 
*/ 
function listMessages($service, $userId, $optArr = []) { 
    $pageToken = NULL; 
    $messages = array(); 
    do { 
    try { 
     if ($pageToken) { 
     $optArr['pageToken'] = $pageToken; 
     } 
     $messagesResponse = $service->users_messages->listUsersMessages($userId, $optArr); 
     if ($messagesResponse->getMessages()) { 
     $messages = array_merge($messages, $messagesResponse->getMessages()); 
     $pageToken = $messagesResponse->getNextPageToken(); 
     } 
    } catch (Exception $e) { 
     print 'An error occurred: ' . $e->getMessage(); 
    } 
    } while ($pageToken); 

    return $messages; 
} 

function getHeaderArr($dataArr) { 
    $outArr = []; 
    foreach ($dataArr as $key => $val) { 
     $outArr[$val->name] = $val->value; 
    } 
    return $outArr; 
} 

function getBody($dataArr) { 
    $outArr = []; 
    foreach ($dataArr as $key => $val) { 
     $outArr[] = base64url_decode($val->getBody()->getData()); 
     break; // we are only interested in $dataArr[0]. Because $dataArr[1] is in HTML. 
    } 
    return $outArr; 
} 

function base64url_decode($data) { 
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); 
} 

function getMessage($service, $userId, $messageId) { 
    try { 
    $message = $service->users_messages->get($userId, $messageId); 
    print 'Message with ID: ' . $message->getId() . ' retrieved.' . "\n"; 

    return $message; 
    } catch (Exception $e) { 
    print 'An error occurred: ' . $e->getMessage(); 
    } 
} 

function listLabels($service, $userId, $optArr = []) { 
    $results = $service->users_labels->listUsersLabels($userId); 

    if (count($results->getLabels()) == 0) { 
     print "No labels found.\n"; 
    } else { 
     print "Labels:\n"; 
     foreach ($results->getLabels() as $label) { 
     printf("- %s\n", $label->getName()); 
     } 
    } 
} 

// Get the API client and construct the service object. 
$client = getClient(); 
$service = new Google_Service_Gmail($client); 
$user = 'me'; 

// Print the labels in the user's account. 
listLabels($service, $user); 

// Get the messages in the user's account. 
$messages = listMessages($service, $user, [ 
    #'maxResults' => 20, // Return 20 messages. 
    'labelIds' => 'INBOX', // Return messages in inbox. 
]); 

foreach ($messages as $message) { 
    print 'Message with ID: ' . $message->getId() . "\n"; 

    $msgObj = getMessage($service, $user, $message->getId()); 

    $headerArr = getHeaderArr($msgObj->getPayload()->getHeaders()); 

    echo 'Message-ID: ' . $headerArr['Message-ID']; 
    echo "\n"; 
    echo 'In-Reply-To: ' . (empty($headerArr['In-Reply-To']) ? '' : $headerArr['In-Reply-To']); 
    echo "\n"; 
    echo 'References: ' . (empty($headerArr['References']) ? '': $headerArr['References']); 
    echo "\n"; 

    #print_r($headerArr); 

    $bodyArr = getBody($msgObj->getPayload()->getParts()); 
    echo 'Body: ' . (empty($bodyArr[0]) ? '' : $bodyArr[0]); 
} 

Riferimento:

https://developers.google.com/gmail/api/quickstart/php https://developers.google.com/gmail/api/v1/reference/users/messages/modify#php

Problemi correlati