2014-07-01 31 views
14

Tôi đã không tải mã nguồn Gmail API mới từ thư viện ứng dụng khách PHP của Google.Đọc thư từ Gmail, bằng PHP, sử dụng API Gmail

tôi inititalized các dịch vụ sử dụng:

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); 

Tôi nên làm gì tiếp theo? Làm cách nào để đọc thư Gmail bằng Gmail API thư viện PHP?

Trả lời

2

Tôi muốn bắt đầu ở đây: https://developers.google.com/gmail/api/v1/reference/users/messages/listhttps://developers.google.com/gmail/api/v1/reference/users/messages/get

lưu ý rằng khi bạn nhận được một danh sách các thông điệp chỉ ID của những thông điệp được trả về sau đó bạn sử dụng ID với method get để thực sự có được nội dung tin nhắn:

+1

Cảm ơn. Bạn có biết làm thế nào để có được nội dung thư với php? $ msg-> getPayload() -> getParts() -> getBody(); không thể tải nội dung thư viện php – Anandhan

+0

cho gmail api được hoàn thành? – Anandhan

+0

Đó là sự thật, chúng tôi chỉ nhận được danh sách các tin nhắn có ID của nó. Vấn đề là làm thế nào để sử dụng tất cả các ID để có được thông điệp của nó, tức là tôi đang cố gắng để đi qua các tài liệu google, nhưng không thể tìm thấy bất kỳ đầu mối. –

16

vì lợi ích của cuộc biểu tình, bạn có thể làm một cái gì đó như thế này:

 $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

Cảm ơn rất nhiều. có thể nhận được thông tin chi tiết bằng cách sử dụng hàm listUersMessages(). Bởi vì nó rất chậm khi tải 20 tin nhắn đầu tiên với chi tiết tin nhắn – Anandhan

+1

Cảm ơn rất nhiều, nó bỏ lỡ tôi sanitizedData bạn có thể giải thích lý do tại sao chúng ta phải làm điều đó? –

+1

@ Jean-LucBarat, tôi đã tìm thấy một lời giải thích tốt hơn những gì tôi đã nghĩ ra. Tín dụng chuyển đến joesmo Có thêm thông số cơ bản64. Nhưng về cơ bản bạn cần 65 ký tự để mã hóa: 26 chữ thường + 26 chữ hoa + 10 chữ số = 62. Bạn cần thêm hai ký tự ['+', '/'] và một ký tự đệm '='. Nhưng không ai trong số họ là url thân thiện, vì vậy chỉ cần sử dụng ký tự khác nhau cho họ và bạn đang thiết lập. Các tiêu chuẩn từ biểu đồ ở trên là ['-', '_'], nhưng bạn có thể sử dụng các ký tự khác miễn là bạn giải mã chúng giống nhau và không cần chia sẻ với người khác. – Muffy

8

này có đầy đủ chức năng, bạn có thể sử dụng nó bởi vì nó hoạt động tốt.

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

Đây là mã mẫu tôi đã sử dụng để phát triển hệ thống bán vé qua email. Nó cho thấy cách truy xuất nhãn, thư và tiêu đề.

<?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]); 
} 

tham khảo:

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

Các vấn đề liên quan