2014-10-06 70 views
-1

當使用下面的代碼來嘗試列出了我剛剛成立了一個全新的Gmail帳戶收到的消息,我得到無法listUserMessages() - 500後端錯誤

[Google_Service_Exception] Error calling GET https://www.googleapis.com/gmail/v1/users/myGmailAccount%40gmail.com/messages: (500) Backend Error

我知道驗證部分正常工作,因爲我可以對this example中顯示的內容進行小修改並查詢書籍API。下面是我用來嘗試查詢最近收到的消息我已經授權給Gmail的訪問API的代碼...

const EMAIL = '[email protected]'; 

private $permissions = [ 
    'https://www.googleapis.com/auth/gmail.readonly' 
]; 

private $serviceAccount = '[email protected]'; 

/** @var Google_Service_Gmail */ 
private $gmail = null; 

/** @var null|string */ 
private static $serviceToken = null; 

public function __construct() 
{ 
    $client = new Google_Client(); 
    $client->setApplicationName($this->applicationName); 
    $this->gmail = new Google_Service_Gmail($client); 

    //authentication 
    if (isset(self::$serviceToken)) { 
     $client->setAccessToken(self::$serviceToken); 
    } 

    $credentials = new Google_Auth_AssertionCredentials(
     $this->serviceAccount, 
     $this->permissions, 
     $this->getKey() 
    ); 
    $client->setAssertionCredentials($credentials); 
    if($client->getAuth()->isAccessTokenExpired()) { 
     $client->getAuth()->refreshTokenWithAssertion($credentials); 
    } 
    self::$serviceToken = $client->getAccessToken(); 
} 

public function getMessages() 
{ 
    $this->gmail->users_messages->listUsersMessages(self::EMAIL); 
} 

enter image description here

500讓我相信這是一個內部錯誤gmail API或我錯過了PHP客戶端未驗證的內容。

回答

2

這一個爲我工作。我的理解是服務帳戶沒有郵箱,它不太確定應該使用哪個郵箱。所以你不能使用listUsersMessages()函數來獲取所有消息。

因此您需要指定服務帳戶需要處理的電子郵件地址。

確保範圍已允許在Web應用程序的API來

1.加入這一行:

$credentials->sub = self::EMAIL; 

前:

$client->setAssertionCredentials($credentials); 

2.然後更新你的getMessages()到:

$this->gmail->users_messages->listUsersMessages("me"); 

希望這有助於!

0

我想這個帳戶已經登錄到web界面了吧?你有沒有嘗試過一個單獨的用戶?如何做像標籤列表的東西呢?你有沒有嘗試使用API​​瀏覽器網站? https://developers.google.com/apis-explorer/#p/gmail/v1/

您能否提供開發者客戶端ID的前5位數字(這不是祕密),所以我可以嘗試追查錯誤?

+0

我已經登錄到Web界面中找到。 API資源管理器正常工作。列表標籤拋出相同的錯誤。我會給另一個用戶一個嘗試....客戶端ID:10391 – Webnet 2014-10-06 18:05:48

+0

我嘗試使用其他用戶並遇到相同的錯誤。 – Webnet 2014-10-06 18:16:50

+0

當您使用上面鏈接的APIs瀏覽器站點爲用戶時,情況如何?你能否在開發者控制檯確認你的認證設置?例如在「API> Credentials」中檢查oauth2,客戶端類型等,並確保您在「API> Consent Screen」上設置了項目名稱和電子郵件。 – 2014-10-06 20:38:37

0

爲了這個工作,你必須模擬一個用戶帳戶(服務帳戶沒有郵箱,因爲lthh89vt指出)。

如果您嘗試直接訪問郵箱,則會出現(500) Back End錯誤。

完整的代碼是:

$client_email = '[email protected]'; 
$private_key = file_get_contents('MyProject.p12'); 
$scopes = array('https://www.googleapis.com/auth/gmail.readonly'); 

$user_to_impersonate = '[email protected]'; 
$credentials = new Google_Auth_AssertionCredentials(
    $client_email, 
    $scopes, 
    $private_key, 
    'notasecret',         // Default P12 password 
    'http://oauth.net/grant_type/jwt/1.0/bearer', // Default grant type 
    $user_to_impersonate, 
); 

$client = new Google_Client(); 
$client->setAssertionCredentials($credentials); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); 
} 

$service = new Google_Service_Gmail($client); 
$results = $service->users_messages->listUsersMessages('me'); 

全部指令可以在Google APIs Client Library for PHP