PHP Fatal error: Uncaught Error: Class 'Google_Service_Gmail_Resource_Users' not found even after calling autoload.php?

PHP Fatal error: Uncaught Error: Class 'Google_Service_Gmail_Resource_Users' not found even after calling autoload.php?

我收到此错误(我正在使用 PHP 7.0 和 Google PHP API 2.9.1,并且我正在使用 OAuth 凭据Web 应用程序):

Uncaught Error: Class 'Google_Service_Gmail_Resource_Users' not found in /google-api-2.9.1/vendor/google/apiclient-services/src/Google/Service/Gmail.php:106
Stack trace:
#0 /public_html/oauth2callback.php(20): Google_Service_Gmail->__construct(Object(Google\Client))
#1 {main} thrown in /public_html/googe-api-2.9.1/vendor/google/apiclient-services/src/Google/Service/Gmail.php on line 106

这是我正在尝试做的事情:

我的index.php:

<?php    
include_once __DIR__ . '/google-api-2.9.1/vendor/autoload.php';
    

$client = new Google_Client();
$client->setAuthConfig(__DIR__ . 'credenciales.json');
$client->addScope(Google_Service_Gmail::GMAIL_READONLY);


if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  $gmail = new Google_Service_Gmail($client);

  $user = 'me';
  $list = $gmail->users_messages->listUsersMessages($user, [ 'q' => ['from:someEmail@gmail.com in:inbox'], ]);
  
  $messageList = $list->getMessages();
  $inboxMessage = [];
  
  foreach($messageList as $mlist){
  
      $optParamsGet2['format'] = 'full';
      $single_message = $gmail->users_messages->get('me',$mlist->id, $optParamsGet2);
  
      $message_id = $mlist->id;
      $headers = $single_message->getPayload()->getHeaders();
      $snippet = $single_message->getSnippet();
  
      foreach($headers as $single) {
  
          if ($single->getName() == 'Subject') {
  
              $message_subject = $single->getValue();
  
          }
  
          else if ($single->getName() == 'Date') {
  
              $message_date = $single->getValue();
              $message_date = date('M jS Y h:i A', strtotime($message_date));
          }
  
          else if ($single->getName() == 'From') {
  
              $message_sender = $single->getValue();
              $message_sender = str_replace('"', '', $message_sender);
          }
      }
  
  
       $inboxMessage[] = [
          'messageId' => $message_id,
          'messageSnippet' => $snippet,
          'messageSubject' => $message_subject,
          'messageDate' => $message_date,
          'messageSender' => $message_sender
      ];
  
      echo json_encode($inboxMessage);
  
  }  



} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

我的 oauth2callback.php 文件:

<?php
require_once __DIR__ . '/google-api-2.9.1/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig(__DIR__ . 'credenciales.json');
$client->setRedirectUri('https://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Gmail::GMAIL_READONLY);


if (! isset($_GET['code'])) {
  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();

  $gmail = new Google_Service_Gmail($client);

  $user = 'me';
  $list = $gmail->users_messages->listUsersMessages($user, [ 'q' => ['from:someEmail@gmail.com in:inbox'], ]);
  
  $messageList = $list->getMessages();
  $inboxMessage = [];
  
  foreach($messageList as $mlist){
  
      $optParamsGet2['format'] = 'full';
      $single_message = $gmail->users_messages->get('me',$mlist->id, $optParamsGet2);
  
      $message_id = $mlist->id;
      $headers = $single_message->getPayload()->getHeaders();
      $snippet = $single_message->getSnippet();
  
      foreach($headers as $single) {
  
          if ($single->getName() == 'Subject') {
  
              $message_subject = $single->getValue();
  
          }
  
          else if ($single->getName() == 'Date') {
  
              $message_date = $single->getValue();
              $message_date = date('M jS Y h:i A', strtotime($message_date));
          }
  
          else if ($single->getName() == 'From') {
  
              $message_sender = $single->getValue();
              $message_sender = str_replace('"', '', $message_sender);
          }
      }
  
  
       $inboxMessage[] = [
          'messageId' => $message_id,
          'messageSnippet' => $snippet,
          'messageSubject' => $message_subject,
          'messageDate' => $message_date,
          'messageSender' => $message_sender
      ];
  
      echo json_encode($inboxMessage);
  
  }  

}

当我接受该应用程序时,google 会将我带到:

https://mywebsite.com/oauth2callback.php?code=4/8521e-kahsd875CLzcbtvppohs584ehtptRa6nXZpjhbFTDGFQjN9jgvQj_7be2E2j654ytv&scope=https://www.googleapis.com/auth/gmail.readonly

所以,我从 Google 获取授权屏幕,我接受了我的应用程序,然后是空白屏幕。显示的错误来自错误日志文件。

为什么我在调用自动​​加载文件时提示找不到 Class 'Google_Service_Gmail_Resource_Users'?

我发现您当前的设置存在一些问题。与您的问题有关的是您没有使用 Composer。它小巧、简单且易于使用,并为您处理所有自动加载的东西。不用担心丢失目录或解压缩错误。 Google API 客户端的 download version 已经包含一个预构建的 Composer 供应商文件夹,因此您不会通过跳过它来节省任何磁盘 space 或代码复杂性。

其次是你的目录结构;根据您的服务器设置方式,有人可以轻松访问 https://mywebsite.example.com/credenciales.json 并获取您的私人数据。

所以这是我的建议:

  • 在您的文档根目录 (/var/www/html/home_dir) 中创建一个 public 文件夹并将 index.phpoauth2callback.php 复制到该文件夹​​。
  • 更新您的服务器配置以指向 /var/www/html/home_dir/public 作为您的文档根目录
  • 更改为 /var/www/html/home_dir 和 运行 composer require google/apiclientinstall Composer 如果您还没有)
  • 根据需要编辑 PHP 文件,将路径调整为 credentiales.json 并将 require 指令更改为指向 /var/www/html/home_dir/vendor/autoload.php.