Reading messages from Gmail, in PHP, using Gmail API

后端 未结 4 1369
-上瘾入骨i
-上瘾入骨i 2020-12-14 03:00

I have donwloaded new Gmail API source code from Google PHP client library.

I inititalized the service using:

set_include_path(\"./google-api-php-cli         


        
相关标签:
4条回答
  • 2020-12-14 03:29

    I'd start here: https://developers.google.com/gmail/api/v1/reference/users/messages/list and https://developers.google.com/gmail/api/v1/reference/users/messages/get

    note that when you get a list of messages only the IDs of those messages are returned then you use the ID with the get method to actually get the message content:

    0 讨论(0)
  • 2020-12-14 03:30

    For the sake of demonstration, you can do something like this:

            $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 讨论(0)
  • 2020-12-14 03:43

    This is the sample code I used to develop an email ticketing system. It shows how to retrieve labels, messages, and headers.

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

    Reference:

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

    0 讨论(0)
  • 2020-12-14 03:45

    This is the full function, You can use it because It worked fine.

    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 讨论(0)
提交回复
热议问题